如何使用XSL选择特定元素节点中的所有文本节点?

时间:2010-05-27 22:57:05

标签: xslt xslt-2.0

如何使用XSL选择特定元素节点中的所有文本节点?

输入xml:

 <node1 id="1">
 <node2 id="2">
 <node3 id="3" />
 <node4 id="4">
 <node5 id="5">Text node1</node5>
 <node6 id="6">Text node2</node6>
 </node4>
 </node2>
 <node7 id="7">Text node3
 <node8 id="8">Text node4</node8>
 <node9 id="9">Text node5</node9>
 </node7>
 <node10 id="10">Text node6</node10>
 <node11 id="11">Text node3
 <node12 id="12">Text node4</node12>
 <node13 id="13">Text node5</node13>
 </node11>
 </node1>

输入参数:要检索其txt节点的元素节点的ID列表。

 <nodes><node>4</node><node>7</node><node>10</node></nodes>

预期产出:

Text node1

Text node2

Text node3

Text node4

Text node5

文字节点6

如何使用XSL实现这一目标?请分享您的想法。

1 个答案:

答案 0 :(得分:2)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

 <xsl:strip-space elements="*"/>

 <xsl:param name="pNodes">
    <nodes>
        <node>4</node>
        <node>7</node>
        <node>10</node>
    </nodes>
 </xsl:param>

 <xsl:variable name="vNodes"
 select="ext:node-set($pNodes)/*/*"/>

 <xsl:template match="/">
   <xsl:for-each select=
      "//*[substring-after(name(),'node')
          = $vNodes
           ]
            //text()">

   <xsl:value-of select="concat(.,'&#xA;')"/>
 </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<node1 id="1">
    <node2 id="2">
        <node3 id="3" />
        <node4 id="4">
            <node5 id="5">Text node1</node5>
            <node6 id="6">Text node2</node6>
        </node4>
    </node2>
    <node7 id="7">Text node3
        <node8 id="8">Text node4</node8>
        <node9 id="9">Text node5</node9>
    </node7>
    <node10 id="10">Text node6</node10>
    <node11 id="11">Text node3
        <node12 id="12">Text node4</node12>
        <node13 id="13">Text node5</node13>
    </node11>
</node1>

产生想要的结果

Text node1
Text node2
Text node3
Text node4
Text node5
Text node6