2012-05-26 87 views
-2

可能重复:
xslt copy then modify element and sortXSLT重复的元素和排序

我有一些XML:

<?xml version="1.0" encoding="utf-8"?> 
<fruit namespace="basket"> 
    <apple> 
    <type>cox</type> 
    <size>medium</size> 
    </apple> 
    <orange> 
    <type>valencia</type> 
    <size>large</size> 
    </orange> 
</fruit> 

想有更多的水果实例和顺序可以是任何东西。我想使用XSLT:

  1. 复制苹果元件和改变型元件到“烹饪苹果”。
  2. 添加该元素在结果树为下位
  3. 排序所有的水果,包括新加入苹果的元素,通过类型

我需要它看起来像

<?xml version="1.0" encoding="utf-8"?> 
<fruit namespace="basket"> 
    <apple> 
    <type>cooking</type> 
    <size>large</size> 
    </apple> 
    <apple> 
    <type>cox</type> 
    <size>medium</size> 
    </apple> 
    <orange> 
    <type>valencia</type> 
    <size>large</size> 
    </orange> 
</fruit> 

灿任何人都请告诉我一个xslt想为此做些什么?

+0

这是功课吗?这些数据似乎并不特别商业化! – Borodin

回答

0

如果您有XSLT 2.0或被允许使用EXSLT,那么exslt:node-set即可。

声明包含节点的变量被添加,这样

<xsl:variable name="fruit"> 
    <apple> 
    <type>cooking</type> 
    <size>large</size> 
    </apple> 
</xsl:variable> 

并用exslt:node-set()在一个排序<xsl:for-each>现有节点一起使用,这样

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:for-each select="*|exslt:node-set($fruit)"> 
     <xsl:sort select="type" /> 
     <xsl:copy-of select="current()" />   
    </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

如果使用XSLT 2.0,那么您可以从变量周围删除exslt:node-set()调用。否则,请记住使用exclude-result-prefixes="exslt"以保持输出整齐!

+0

感谢您的输入。非常感谢。我只能使用xslt 1.0 ...在该版本中可能类似 – user1418215

+0

您的XSLT处理器是否具有EXSLT扩展? – Borodin

+0

不,我发现很难复制一种类型的元素,然后用新元素对列表进行排序。 – user1418215