如何使用 XSL 选择特定元素节点中的所有文本节点?
Posted
技术标签:
【中文标题】如何使用 XSL 选择特定元素节点中的所有文本节点?【英文标题】:How do i select all the text nodes within a specific element node using XSL? 【发布时间】:2011-02-24 22:02:48 【问题描述】:如何使用 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>
Input Param:要检索其txt节点的元素节点的id列表。
<nodes><node>4</node><node>7</node><node>10</node></nodes>
预期输出:
文本节点1
文本节点2
文本节点3
文本节点4
文本节点5
文本节点6
如何使用 XSL 实现这一点?请分享您的想法。
【问题讨论】:
好问题 (+1)。请参阅我的答案以获得完整的解决方案。 【参考方案1】:这种转变:
<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
【讨论】:
当我在 Java SAXON 处理器中运行它时,它给出了错误,找不到名为 exslt.org/commonnode-set() 的匹配 1-argument 函数 @user323719:您使用的是 Saxon9.x,它是一个 XSLT 2.0 处理器。在 XSLT 2.x 中,您不需要xxx:node-set()
函数——只需删除它,然后使用:<xsl:variable name="vNodes" select="$pNodes/*/*"/>
以上是关于如何使用 XSL 选择特定元素节点中的所有文本节点?的主要内容,如果未能解决你的问题,请参考以下文章