使用XSLT合并XML节点

时间:2008-12-03 16:22:47

标签: xslt

是否可以使用XSLT合并元素。

如果我有以下XML

<data>
<item column="left" value="1" />
<item column="left" value="2" />
<item column="right" value="3" />
<item column="left" value="4" />
<item column="right" value="5" />
<item column="right" value="6" />
<item column="right" value="7" />
<item column="left" value="8" />
<item column="right" value="9" />
<item column="right" value="10" />
</data>

我想要以下输出:

<data>
<item left="1" right="3 />
<item left="2" right="5" />
<item left="4" right="6" />
<item left="8" right="7" />
<item left="" right="9" />
<item left="" right="10" />
</data>

但我完全不知道是否可以使用XSLT

2 个答案:

答案 0 :(得分:8)

这种转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="data">
      <xsl:variable name="vNumLeft" select="count(item[@column='left'])"/>

      <data>
        <xsl:apply-templates select="*[@column='left']"/>
        <xsl:apply-templates select=
                "*[@column='right'][position() > $vNumLeft]"/>
      </data>
    </xsl:template>

    <xsl:template match="item[@column='left']">
      <xsl:variable name="vPos" select="position()"/>

      <item left="{@value}" 
                    right="{../item[@column='right'][$vPos]/@value}"    />
    </xsl:template>

    <xsl:template match="item[@column='right']">
      <item left="" right="{@value}" />
    </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<data>
    <item column="left" value="1" />
    <item column="left" value="2" />
    <item column="right" value="3" />
    <item column="left" value="4" />
    <item column="right" value="5" />
    <item column="right" value="6" />
    <item column="right" value="7" />
    <item column="left" value="8" />
    <item column="right" value="9" />
    <item column="right" value="10" />
</data>

产生想要的结果:

<data>
   <item left="1" right="3"/>
   <item left="2" right="5"/>
   <item left="4" right="6"/>
   <item left="8" right="7"/>
   <item left="" right="9"/>
   <item left="" right="10"/>
</data>

答案 1 :(得分:-3)

您将使用元素和属性标记...

<xsl:element name="item">
    <xsl:attribute name="left"><xsl:value-of select="$theLeft"/></xsl:attribute>
    <xsl:attribute name="right"><xsl:value-of select="$theRight"/></xsl:attribute>
</xsl:element>

...至于确定$ theLeft和$ theRight应该是什么的算法,我把它留给你。