首页 文章

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

提问于
浏览
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>

预期产出:

文本node1

文本node2

文本节点3

文本节点4

文本节点5

文本节点6

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

1 回答

  • 2

    This transformation

    <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>
    

    when applied on the provided XML document

    <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>
    

    produces the wanted result

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

相关问题