使用XSLT在XML中进行修改

时间:2013-06-04 14:35:59

标签: xml xslt xslt-1.0

我想使用xslt从给定的xml获取输出xml。输出xml将在给定的xml中添加一些元素。但是我没有得到所需的输出。

我有一个输入xml,如:

  <Response xmlns="http://xyz.abc/max/"  xmlns:ns1="http://xyz.abc/max/">
    <out xmlns="">
        <Number xmlns="http://xyz.abc/max/">Desc1</Number>
        <Address xmlns="http://xyz.abc/max">Desc2</Address>
        <Records xmlns="http://xyz.abc/max">Desc3</Records>
    </out>
</Response>

我想要输出xml,如:

<?xml version="1.0" encoding="UTF-8"?>
<abc:Reqeust xmlns:abc="http://www.nnn.com/bnm"
xmlns:ns1="http://xyz.abc/max/" xmlns="http://xyz.abc/max/" >
    <abc:Tray>
        <abc:Remote>
            <abc:ID>ID1</abc:ID>
            <abc:Distance>Always</abc:Distance>
        </abc:Remote>
        <abc:Time>
            1100-01-01T01:01:01+05:30
        </abc:Time>
        <abc:AreaMap />
    </abc:Tray>
    <abc:Area>
        <abc:Get>
            <abc:Fault>Token1</abc:Fault>
        </abc:Get>
        <Response xmlns="http://xyz.abc/max/"  xmlns:ns1="http://xyz.abc/max/">
            <out xmlns="">
                <Number xmlns="http://xyz.abc/max/">Desc1</Number>
                <Address xmlns="http://xyz.abc/max">Desc2</Address>
                <Records xmlns="http://xyz.abc/max">Desc3</Records>
            </out>
        </Response>
    </abc:Area>
</abc:Reqeust>

我正在使用xslt:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:abc="http://www.nnn.com/bnm"
xmlns:ns1="http://xyz.abc/max/" xmlns="http://xyz.abc/max/" >
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Response">
        <abc:Request>
            <abc:Tray>
                <abc:Remote>
                    <abc:ID>ID1</abc:ID>
                    <abc:Distance>Always</abc:Distance>
                </abc:Remote>
                <abc:Time>
                    1100-01-01T01:01:01+05:30
                </abc:Time>
                <abc:AreaMap />
            </abc:Tray>
            <abc:Area>
                <abc:Get>
                    <abc:Fault>Token1</abc:Fault>
                </abc:Get>
                <Response>
                    <xsl:apply-templates select="@*|node()"/>
                </Response>
            </abc:Area>
        </abc:Request>
    </xsl:template>
</xsl:stylesheet>

但我没有得到所需的输出。 我应该在xslt中进行哪些更改才能获得所需的输出xml?

1 个答案:

答案 0 :(得分:0)

在xslt-1.0中,您始终使用名称空间前缀来访问属于名称空间的名称。
输入XML中的 Response 元素属于默认命名空间xmlns="http://xyz.abc/max/" 您已将此命名空间添加为xmlns:ns1="http://xyz.abc/max/

因此,请更改“响应”表单的模板:

<xsl:template match="Response">

为:

<xsl:template match="ns1:Response">

将生成以下输出:

<?xml version="1.0"?>
<abc:Request xmlns:abc="http://www.nnn.com/bnm" xmlns:ns1="http://xyz.abc/max/" xmlns="http://xyz.abc/max/">
    <abc:Tray>
        <abc:Remote>
            <abc:ID>ID1</abc:ID>
            <abc:Distance>Always</abc:Distance>
        </abc:Remote>
        <abc:Time>
            1100-01-01T01:01:01+05:30
        </abc:Time>
        <abc:AreaMap/>
    </abc:Tray>
    <abc:Area>
        <abc:Get>
            <abc:Fault>Token1</abc:Fault>
        </abc:Get>
        <Response>
            <out xmlns="">
                <Number xmlns="http://xyz.abc/max/">Desc1</Number>
                <Address xmlns="http://xyz.abc/max">Desc2</Address>
                <Records xmlns="http://xyz.abc/max">Desc3</Records>
            </out>
        </Response>
    </abc:Area>
</abc:Request>