2010-05-28 72 views
0

我有一個節點標識列表。我想將「-Selected」追加到給定的一組節點ID中的所有文本節點。請讓我知道我們如何使用XSL實現相同?如何修改使用XSL的指定節點集內的文本內容?

輸入:

<node1 id="a"> 
    <node2 id="b"> 
     <node3 id="c">Text node0</node3> 
     <node4 id="d"> 
      <node5 id="e">Text node1</node5> 
      <node6 id="f">Text node2</node6> 
     </node4> 
    </node2> 
    <node7 id="g">Text node3 
     <node8 id="h" align="center">Text node4</node8> 
     <node9 id="i">Text node5</node9> 
    </node7> 
    <node10 id="j">Text node6 
    </node10> 
     <node11 id="h">Text node7 
    </node11> 
</node1> 

輸入參數:節點ID的列表

<nodes> 
    <node>b</node> 
    <node>g</node> 
    <node>h</node> 
</nodes> 

如果輸入參數具有節點「A」然後我需要與選定要追加的所有文本節點。

預期輸出:

<node1 id="a"> 
<node2 id="b"> 
    <node3 id="c">Text node0 - Selected<node3/> 
    <node4 id="d"> 
     <node5 id="e">Text node1 - Selected</node5> 
     <node6 id="f">Text node2 - Selected</node6> 
    </node4> 
</node2> 
<node7 id="g">Text node3 - Selected 
    <node8 id="h" align="center">Text node4 - Selected</node8> 
    <node9 id="i">Text node5 - Selected</node9> 
</node7> 
<node10 id="j">Text node6 
</node10> 
<node11 id="h">Text node7 - Selected 
</node11> 
</node1> 
+0

不會選擇文本節點3,因爲它是''的子節點,還是隻希望文本節點是所選節點的子元素的子節點? – 2010-05-28 15:30:32

+0

你說得對。文本節點3也應該被選中。我的輸入參數也被編輯。它具有元素節點的id值。 – user323719 2010-05-28 15:40:31

+0

再好問題(+1)。查看我的答案,找到非常簡單直接的解決方案。 – 2010-05-28 16:32:18

回答

3

這種變換:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:strip-space elements="*"/> 

<xsl:param name="pNodes"> 
    <nodes> 
     <node>b</node> 
     <node>g</node> 
     <node>h</node> 
    </nodes> 
</xsl:param> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[@id = $pNodes/*/*]//text()"> 
    <xsl:value-of select="concat(., ' Selected')"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔被應用時產生有用的,正確的結果。

2

此XSLT樣式表2.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:param name="pNodes"> 
     <nodes> 
      <node>b</node> 
      <node>g</node> 
      <node>h</node> 
     </nodes> 
    </xsl:param> 

    <xsl:template match="text()" > 
     <xsl:value-of select="." /> 
     <xsl:if test="ancestor::*[@id = $pNodes/*/*] and normalize-space()!=''"> 
      <xsl:text> - Selected</xsl:text> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="@* | * | comment() | processing-instruction()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

使用修改的身份變換。 text()上的模板匹配具有if語句,該語句評估文本節點是否爲具有@id誰值與指定節點之一匹配的元素的後代,並且文本節點不是全部空白(您可以根據需要調整該空格,然而在其他方面)。如果它符合這些標準,則它輸出「 - 選擇」。

施加到樣品輸入它產生以下輸出:

<?xml version="1.0" encoding="UTF-8"?><node1 id="a"> 
    <node2 id="b"> 
     <node3 id="c"/> 
     <node4 id="d"> 
      <node5 id="e">Text node1 - Selected</node5> 
      <node6 id="f">Text node2 - Selected</node6> 
     </node4> 
    </node2> 
    <node7 id="g">Text node3 
      - Selected<node8 id="h" align="center">Text node4 - Selected</node8> 
     <node9 id="i">Text node5 - Selected</node9> 
    </node7> 
    <node10 id="j">Text node6 
    </node10> 
    <node11 id="h">Text node7 
     - Selected</node11> 
</node1> 
+0

我真的很抱歉。我剛剛通過輸入參數進行編輯,以接受元素節點的ID – user323719 2010-05-28 15:47:09