2016-03-28 7 views
2

У меня есть XML, как это,XSLT - определить узел с последующим другим узлом

<doc> 
    <p>para<x>para</x>para<x>para</x>para</p> 
    <p>para<x>para</x><x>para</x>para</p> 
</doc> 

мне нужно добавить «» между <x> узлов, если пара <x> размещены последовательно (<x> следует другой <x> узел) ,

так, для вышеприведенного примера XML, вывод должен быть,

<doc> 
    <p>para<x>para</x>para<x>para</x>para</p> 
    <p>para<x>para</x>,<x>para</x>para</p> 
</doc> 

Я попытался написать XSL шаблон FO идентификации последовательных <x> отмечены и добавил '' следующим образом,

<xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="x[following-sibling::*[1][self::x]]"> 
     <x> 
      <xsl:apply-templates/> 
     </x> 
     <xsl:text>,</xsl:text> 
    </xsl:template> 

но он добавляет «,» к указанным выше сценариям. (<x>, а затем еще один узел <x> и <x>, за которым следует текст)

Любая идея исправить это xpath?

ответ

3

С помощью following-sibling::*[1] XPath только проверка на наличие ближайшего следующих двойников элемент, не считая текстовые узлы. Вместо этого используйте following-sibling::node()[1]:

<xsl:template match="x[following-sibling::node()[1][self::x]]"> 
    <x> 
     <xsl:apply-templates/> 
    </x> 
    <xsl:text>,</xsl:text> 
</xsl:template>