如何使用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实现这一目标?请分享您的想法。
答案 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(.,'
')"/>
</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