使用xslt在现有xml节点下追加新的xml节点

时间:2019-03-19 09:34:41

标签: xslt

我正在尝试在现有XML节点下追加一个新的XML节点,但无法达到预期的效果。

请在下面找到我的XML

    <Root>
        <Row>
            <A1>0</A1>
            <A2>1</A2>
            <Preferred_First_Name>aaaa</Preferred_First_Name>
            <Preferred_Last_Name>yyyy</Preferred_Last_Name>
            <location>xxxx</location>
            <ID>12345</ID>
        </Row>
    </Root>

我要修改上述XML,使Preferred_First_Name,Preferred_Last_Name和location节点需要位于新的XML标记“ Data”下。

所需的输出应如下所示,

<Root>
    <Row>
        <A1>0</A1>
        <A2>1</A2>
        <Data>
            <Preferred_First_Name>aaaa</Preferred_First_Name>
            <Preferred_Last_Name>yyyy</Preferred_Last_Name>
            <location Descriptor="xxxx">
                <ID type="ID">xxxx</ID>
                <ID type="LocationID">xxxx</ID>
            </location>
        </Data>
        <ID>12345</ID>
    </Row>
</Root>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以在下面使用

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="Root">
        <xsl:element name="Root">
            <xsl:call-template name="Row" />
        </xsl:element>
    </xsl:template>
    <xsl:template name="Row">
        <xsl:element name="Row">
            <xsl:copy-of select="Row/A1"/>
            <xsl:copy-of select="Row/A2"/>
            <xsl:element name="Data">
            <xsl:copy-of select="Row/Preferred_First_Name"/>
            <xsl:copy-of select="Row/Preferred_Last_Name"/>
            <xsl:element name="location">
                <xsl:attribute name="Descriptor">
                    <xsl:value-of select="Row/location"/>
                </xsl:attribute>
                <xsl:element name="ID">
                    <xsl:attribute name="type">
                        <xsl:value-of select="'ID'"/>
                    </xsl:attribute>
                    <xsl:value-of select="Row/location"/>
                </xsl:element>
            <xsl:element name="ID">
                <xsl:attribute name="type">
                    <xsl:value-of select="'LocationID'"/>
                </xsl:attribute>
                <xsl:value-of select="Row/location"/>
            </xsl:element>
            </xsl:element>
                    <xsl:copy-of select="Row/ID"/>
        </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

请让我知道这对您有帮助

答案 1 :(得分:0)

如果可以将<ID>放在 Tim C 提到的<Data>之后,那么优化的解决方案可以是:

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

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

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

<xsl:template match="Row">
    <Row>
        <xsl:apply-templates select="child::node()[not(self::Preferred_First_Name or self::Preferred_Last_Name
                                                    or self::location)]" />
        <Data>
             <xsl:apply-templates select="child::node()[self::Preferred_First_Name or self::Preferred_Last_Name
                                                    or self::location]"/>  
        </Data>
    </Row>
</xsl:template>

</xsl:stylesheet>