如何使用 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(.,'&#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

【讨论】:

当我在 Java SAXON 处理器中运行它时,它给出了错误,找不到名为 exslt.org/commonnode-set() 的匹配 1-argument 函数 @user323719:您使用的是 Saxon9.x,它是一个 XSLT 2.0 处理器。在 XSLT 2.x 中,您不需要 xxx:node-set() 函数——只需删除它,然后使用:&lt;xsl:variable name="vNodes" select="$pNodes/*/*"/&gt;

以上是关于如何使用 XSL 选择特定元素节点中的所有文本节点?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 xsl 从节点中写入文本

如何以编程方式仅选择用户可选择的所有文本节点

如何使用 jQuery 选择文本节点?

XSL 节点集:不按名称查找子元素

尝试选择节点时如何在 xsl 中使用变量?

Xpath:选择除具有特定属性的元素之外的所有元素