如果父和子xml标记在xslt中具有相同的名称,如何在源与目标之间保持相同的结构

时间:2017-08-29 08:22:05

标签: xml xslt-1.0 xslt-2.0

以下是我的要求 我有订单输入包含项目,每个项目包含子项目,但标签名称是相同的“项目”。

<OrderInput>
    <Item>
        <ItemId>
        <ItemName>
        <ItemDesc>
        <Item>
            <ItemId>
            <ItemName>
            <ItemDesc>
            <Item>
                <ItemId>
                <ItemName>
                <ItemDesc>
            </Item>
        </Item>
    </Item>
    <Item>
        <ItemId>
        <ItemName>
        <ItemDesc>
        <Item>
            <ItemId>
            <ItemName>
            <ItemDesc>
        </Item>
    </Item>
</OrderInput>

使用xslt进行转换后,它应如下所示。父级和chils节点具有相同的名称“Line”,如源“Item”

<OrderOutput>
    <OrderLine>
    <Line>
        <LineId>
        <LineName>
        <LineDesc>
        <Line>
            <LineId>
            <LineName>
            <LineDesc>
            <Line>
                <LineId>
                <LineName>
                <LineDesc>
            </Line>
        </Line>
    </Line>
    <Line>
        <LineId>
        <LineName>
        <LineDesc>
        <Line>
            <LineId>
            <LineName>
            <LineDesc>
        </Line>
    </Line>
</OrderOutput>

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以在转换时使用元素名称中的替换

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="OrderInput">
        <OrderOutput>
            <xsl:apply-templates/>
        </OrderOutput>
    </xsl:template>

    <xsl:template match="*[starts-with(name(.), 'Item')]">
        <xsl:element name="{replace(name(.), '^Item', 'Line')}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>