2012-07-24 112 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