2017-03-03 86 views
0

我們試圖使用XSLT 1.0分別爲每個節點獲取唯一值。例如,XSLT 1.0分別在節點級別獲取唯一值

<root> 
<node name="1234"> 
    <node name="9876"> 
     <child ln="2" name="CA1"> 
      <CA01>10</CA01> 
     </child> 
    </node> 
    <node name="9876"> 
     <child ln="2" name="CA1"> 
      <CA01>9</CA01> 
     </child> 
    </node> 
    <node name="9876"> 
     <child ln="2" name="CA1"> 
      <CA01>10</CA01> 
     </child> 
    </node> 
</node> 
<node name="1234"> 
    <node name="9876"> 
     <child ln="2" name="CA1"> 
      <CA01>10</CA01> 
     </child> 
    </node> 
    <node name="9876"> 
     <child ln="2" name="CA1"> 
      <CA01>5</CA01> 
     </child> 
    </node> 
</node> 

與代碼

<!-- Template called for each node 1234 --> 
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01/text()  [generate-id() 
            = generate-id(key('CA01Code',.)[1])]"> 
    <xsl:value-of select="."/> 

預期輸出

對於第一節點1234 =>10,9

對於第二節點1234 =>10,5

但是稱爲用於每個1234節點當實際輸出給不同的輸出

實際輸出

對於第一節點1234 =>10,9

對於第二節點1234 =>

編輯 XSLT與按鍵定義

鍵定義

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01/text()" use="." /> 

模板定義

<xsl:template match="node[@name='1234']"> 
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01/text()[generate-id() = generate-id(key('CA01Code',.)[1])]"> 
    <xsl:value-of select="."/> 
</xsl:for-each> </xsl:template> 
+1

請告訴我們主要定義完整的XSLT。通常,爲了將搜索限制在XSLT 1.0中的子樹中,可以使用一個鍵連接祖先的生成標識,例如''。 –

+0

感謝Martin給予快速回復。更新了關鍵定義和模板定義。請檢查 – sainathas

回答

0

變化

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01/text()" use="." /> 

<xsl:key name="CA01Code" match="node[@name='9876']/child[@name='CA1']/CA01" use="concat(generate-id(ancestor::node[last()]), '|', .)"/> 

,然後模板

<xsl:template match="node[@name='1234']"> 
<xsl:for-each select="node[@name='9876']/child[@name='CA1']/CA01[generate-id() = generate-id(key('CA01Code',concat(generate-id(ancestor::node[last()]), '|', .))[1])]"> 
    <xsl:value-of select="."/> 
</xsl:for-each> 
</xsl:template> 
+0

謝謝馬丁。這工作。 – sainathas