0

我有这个 XML:

    <root>   
      <tab name="Detail">
        <section name="mysection">
          <items level="1">
            <Idx_name>9</Idx_name>
            <Type>mytype</Type>
            <item name="myname">
              <Grams um="(g)">9,0</Grams>
              <Pre-infusion>Max</Pre-infusion>
            </item>
            <Std._Mode>On</Std._Mode>
            <Price>100</Price>
          </items>
        </section>   
    </tab> 
</root>

这个 XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="node()">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="items/*">
    <xsl:choose>
      <xsl:when test="not(name()='item')">
        <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:value-of select="."/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

现在,我想要的是:

<root>
  <tab name="Detail">
    <section name="mysection">
      <items level="1" Idx_name="9" Type="mytype" Std._Mode="On" Price="100">
        <item name="myname">9,0Max</item>
      </items>
    </section>
  </tab>
</root>

我收到错误消息:“不能在孩子之后添加属性”

不幸的是,我无法更改原始 XML 的节点项中的元素顺序

我该怎么做 ?

谢谢

伊万

4

1 回答 1

0

确保首先处理要转换为属性的元素,例如使用 XSLT 2.0,您可以在其中处理具有您可以简单执行的顺序的序列

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@*, node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="items">
  <xsl:copy>
    <xsl:apply-templates select="@*, * except item, item"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="items/*[not(self::item)]">
  <xsl:attribute name="{name()}" select="."/>
</xsl:template>

<xsl:template match="items/item">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:value-of select="."/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

使用 XSLT 1.0,您需要按您想要的顺序拼出几个apply-templates

于 2012-07-16T09:44:33.113 回答