1

如何使用 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>

预期输出:

文本节点1

文本节点2

文本节点3

文本节点4

文本节点5

文本节点6

如何使用 XSL 实现这一点?请分享你的想法。

4

1 回答 1

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
于 2010-05-28T01:13:26.007 回答