2010-05-27 44 views
1

如何使用XSL選擇特定元素節點內的所有文本節點?如何使用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

文本node6

怎麼可以這樣使用XSL實現?請分享你的想法。

+0

好問題(+1)。查看我的答案獲得完整的解決方案。 – 2010-05-28 01:14:08

回答

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

當我在Java中SAXON處理器運行它,它給出了錯誤,無法找到名爲匹配的1-參數函數{} http://exslt.org/common節點集() – user323719 2010-05-28 14:15:48

+0

@ user323719:您正在使用Saxon9.x這是一款XSLT 2.0處理器。在XSLT 2.x中,您不需要'xxx:node-set()'函數 - 只需將其刪除,然後使用:' – 2010-05-28 14:37:06

+0

感謝它的工作。 – user323719 2010-05-28 14:47:37

相關問題