-2

可能重复:
xslt 复制然后修改元素并排序

我有一些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. 复制 apple 元素并将 type 元素更改为“cooking apple”。
  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 对此有何要求?

4

1 回答 1

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()sorted 中的现有节点一起使用<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"以保持输出整洁!

于 2012-05-27T01:22:27.093 回答