使用XSLT编号子节点

时间:2014-03-11 17:03:59

标签: xml xslt

我需要为子节点编号,使其与xml中存在的次数一致 例如,如果xml看起来像这样

<Orders>
<Date>23-jan-2014</Date>
<Order>
<Code>Abc</Code>
</Order>
<Order>
<Code>Abc</Code>
</Order>
<Order>
<Code>Abc</Code>
</Order>
</Orders>

我需要这样

<Orders>
<Date>23-jan-2014</Date>
<Order>
<Sq>1</Sq>
<Code>Abc</Code>
</Order>
<Order>
<Sq>2</Sq>
<Code>Abc</Code>
</Order>
<Order>
<Sq>3</Sq>
<Code>Abc</Code>
</Order>
.
.
.
.

</Orders>

2 个答案:

答案 0 :(得分:3)

这是一个使用xsl:number代替position()的选项。 xsl:numberposition()更强大,所以如果您的输入比您的示例更复杂,它可能会派上用场。

XML输入

<Orders>
    <Date>23-jan-2014</Date>
    <Order>
        <Code>Abc</Code>
    </Order>
    <Order>
        <Code>Abc</Code>
    </Order>
    <Order>
        <Code>Abc</Code>
    </Order>
</Orders>

XSLT 1.0

<xsl:stylesheet version="1.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="Order">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <Seq><xsl:number/></Seq>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML输出

<Orders>
   <Date>23-jan-2014</Date>
   <Order>
      <Seq>1</Seq>
      <Code>Abc</Code>
   </Order>
   <Order>
      <Seq>2</Seq>
      <Code>Abc</Code>
   </Order>
   <Order>
      <Seq>3</Seq>
      <Code>Abc</Code>
   </Order>
</Orders>

答案 1 :(得分:2)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Orders">
    <xsl:copy>
        <xsl:copy-of select="Date"/>
        <xsl:apply-templates select="Order"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="Order">
    <xsl:copy>
        <Sq><xsl:value-of select="position()"/></Sq>
        <xsl:copy-of select="*"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>