使用xsl

时间:2019-10-15 13:12:54

标签: xml xslt xpath

我正在用xsl修改我的xml文档,并且无法分离节点的内容。这是一个示例:

输入XML文档

<root>
  <exampleNode>text 1 <insideNodeA/> text 2 <insideNodeB/> text 3</exampleNode>
  <exampleNode>text 4<insideNodeB/></exampleNode>
</root>

因此,简而言之,我有一个节点,可以在其中输入一些文本,还可以按任意顺序输入各种不同的节点(或无节点)。无法事先知道内容是文本,文本和一个节点,还是节点,文本和两个节点(按任意顺序),等等。

这就是我需要的:

想要的XML输出

<root>
 <unwrapped>
   <txt>text 1</txt>
   <reworkedNodeA/>
   <txt>text 2</txt>
   <reworkedNodeB/>
   <txt>text 3</txt>
 </unwrapped>
 <unwrapped>
   <txt>text 4</txt>
   <reworkedNodeB/>
 </unwrapped>
</root>

当然,我正在重新设计insideNodeA和B。

我的XSL代码

<xsl:template match="exampleNodee">
  <xsl:if test="count(*)&gt;0">
     <xsl:element name="unwrapped">
        <xsl:element name="txt"><xsl:value-of select="text()"/></xsl:element>
        <xsl:apply-templates select="child::node()"/>
     </xsl:element>
  </xsl:if>
</xsl:template>

麻烦的是,此代码仅使用“ exampleNode”的第一个文本创建一个“ txt”元素,然后将模板应用于每个子节点。

如何才能以正确的顺序检索“ exampleNode”的内容并应用正确的模板以获得所需的输出?

1 个答案:

答案 0 :(得分:0)

好的,我实际上找到了问题的答案,毕竟这很简单。

所以我所要做的就是创建一个匹配“ text()”的模板,并将我的exmplepleNode模板更改为:

<xsl:element name="unwrapped">
  <xsl:apply-templates select="text() | node()"/>
</xsl:element>