2012-07-24 145 views
0

我有節點的這樣獲取節點集的屬性集合

<node id="1"> 
    <languaje>c</languaje> 
    <os>linux</os> 
</node> 
<node id="2"> 
    <languaje>c++</languaje> 
    <os>linux</os> 
</node> 
<node id="3"> 
    <languaje>c#</languaje> 
    <os>window</os> 
</node> 
<node id="4"> 
    <languaje>basic</languaje> 
    <os>mac</os> 
</node> 

的集合,我想創建所有的id屬性的一個新的收集這樣

<root> 
<token>1</token> 
<token>2</token> 
<token>3</token> 
<token>4</token> 
</root> 

如何能做到這一點

回答

1

所有你需要的是

<xsl:output indent="yes"/> 

<xsl:template match="*[node]"> 
    <root> 
    <xsl:apply-templates select="node"/> 
    </root> 
</xsl:template> 

<xsl:template match="node"> 
    <token><xsl:value-of select="@id"/></token> 
</xsl:template> 

如果要將結果存儲在變量中,可以使用XSLT 1.0創建結果樹片段,例如,

<xsl:variable name="rtf1"> 
    <xsl:apply-templates select="node()" mode="m1"/> 
</xsl:variable> 

    <xsl:template match="*[node]" mode="m1"> 
     <root> 
     <xsl:apply-templates select="node" mode="m1"/> 
     </root> 
    </xsl:template> 

    <xsl:template match="node" mode="m1"> 
     <token><xsl:value-of select="@id"/></token> 
    </xsl:template> 

然後就可以做<xsl:copy-of select="$rtf1"/>使用結果樹片段,或與「exsl:節點set`可以處理與XPath和XSLT例如所創建的節點

<xsl:apply-templates select="exsl:node-set($rtf1)/root/token"/> 

使用XSLT 2.0不再有結果樹片段,您可以像使用任何輸入變量,而不需要的擴展功能。

+0

謝謝..所以現在如何將結果存儲在變量中? – 2012-07-24 17:22:25

+0

在XSLT 1.0中,您可以創建一個帶有結果樹片段的變量,XSLT 2.0帶有臨時文檔,我將編輯我的答案以顯示該結果。 – 2012-07-24 17:33:02

1

如果你可以使用XQuery,你可以做這樣的:

<root> 
    { ($document/node/<node>{string(@id)}</node>) } 
</root> 

這是恕我直言,最清晰的解決方案。

否則,你可以創建一個字符串(而不是文件)通過連接標籤和你的IDS包含您想要的結果使用XPath 2:

concat("<root>", string-join(for $i in /base/node/@id return concat("<node>",$i,"</node>"), " ") , "</root>") 
0

如果你換一個標籤下的所有節點,就像<節點>這個工程:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<root> 
    <xsl:apply-templates select="*" /> 
</root> 
</xsl:template> 

<!-- templates --> 
    <xsl:template match="node"> 
    <token><xsl:value-of select="@id" /></token> 
</xsl:template> 
</xsl:stylesheet> 

測試在XsltCake

http://www.xsltcake.com/slices/E937yH