移动特定节点

时间:2011-06-15 10:22:10

标签: xml xslt xslt-1.0

我是xslt的新手,现在我已经没想到了。希望你偷看可以帮助我回到正轨。

鉴于从第三方传递给我们的以下XML:

<orderbatch>
<orders>
<order>
<id>1</id>
<customerid>2001</customerid>
<articleid>345</articleid>
</order>
</orders>
<customers>
<customer>
<id>2001</id>
<name>John Smith</name>
</customer>
</customers>
</orderbatch>

如果我想通过xslt在订单节点下移动相应的客户节点,以获得此输出:

<orderbatch>
<orders>
<order>
<id>1</id>
<customerid>2001</customerid>
<articleid>345</articleid>
<customer>
<id>2001</id>
<name>John Smith</name>
</customer>
</order>
</orders>
<customers>
<customer>
<id>2001</id>
<name>John Smith</name>
</customer>
</customers>
</orderbatch>

我有一个具有固定值的工作xslt,但我有点不知道如何参数化它:

<xsl:output method="xml"/>

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

<xsl:key name="customerList" match="/orderbatch/customers/customer" use="id"/>

<xsl:template match="order">
    <xsl:copy>
        <xsl:value-of select="id"/>
        <customer>
            <xsl:value-of select="key('customerList', '2001')"/>            
        </customer>
    </xsl:copy>
</xsl:template>

由于某种原因,我不能使用xsl:variable,current()/ customerid而不是'2001',因为这会导致订单节点处的空节点(而客户列在客户列表中)。那么,问题是,如何在复制块的选择中参数化'2001'? (或者我在这里做错了什么?)

1 个答案:

答案 0 :(得分:0)

要复制您的客户,请不要使用value-of而是copy-of。

<xsl:template match="order">
    <xsl:copy>
        <xsl:copy-of select="customerid"/>
        <xsl:copy-of select="key('customerList', customerid)" />
    </xsl:copy>
</xsl:template>

BTW,current()在这里不是必需的,因为order是上下文节点。