XSLT - 为某些子项添加名称空间声明

时间:2016-10-05 13:01:42

标签: xml xslt

由于某些原因,我需要更改现有的xml文件,我想使用xslt来做到这一点。我需要将一些名称空间声明从根节点移动到子节点。

基本上我从一个看起来像这样的文件开始:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
<env:Header>
    <ns1:parent11>

        <ns1:child11>value</ns1:child11>
        <ns1:child11>value</ns1:child11>
        <ns1:child11>value</ns1:child11>

        <ns1:child12>
            <ns2:child21>value</ns2:child21>
            <ns2:child22>value</ns2:child22>
        </ns1:child12>

    </ns1:parent11>
</env:Header>


<env:Body>
    <ns3:parent31>
        <ns3:child31>value</ns3:child31>
        <ns3:child32>value</ns3:child32>

        <ns3:child33>
            <ns2:parent2>
                <ns2:child23>value</ns2:child23>
                <ns2:child23>value</ns2:child23>
                <ns2:child23>value</ns2:child23>
            </ns2:parent2>
        </ns3:child33>

    </ns3:parent31>
</env:Body>

我需要以这样的结局结束:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
<env:Header>
    <parent11 xmlns="http://ns1">

        <child11>value</child11>
        <child11>value</child11>
        <child11>value</child11>

        <child12>
            <ns2:child21>value</ns2:child21>
            <ns2:child22>value</ns2:child22>
        </child12>

    </parent11>
</env:Header>


<env:Body>

    <parent31 xmlns="http://ns3">
        <child31>value</child31>
        <child32>value</child32>

        <child33>
            <parent2 xmlns="http://ns2">
                <child23>value</child23>
                <child23>value</child23>
                <child23>value</child23>
            </parent2>
        </child33>

    </parent31>
</env:Body>

我是xslt中的一个完全新手(我选择它是因为我认为这是正确的方法),所以我一开始就陷入困境,我甚至不知道如何开始。

1 个答案:

答案 0 :(得分:0)

解决方案XSLT 1.0 / XSLT 2.0:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://ns1"
    xmlns:ns2="http://ns2"
    xmlns:ns3="http://ns3"
    version="1.0">

    <xsl:template match="ns1:* | ns2:* | ns3:*">
        <xsl:element name="{local-name()}" namespace="{namespace-uri()}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

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

</xsl:stylesheet>

<强>输出:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1"
    xmlns:ns2="http://ns2" xmlns:ns3="http://ns3">
    <env:Header>
        <parent11 xmlns="http://ns1">

            <child11>value</child11>
            <child11>value</child11>
            <child11>value</child11>

            <child12>
                <child21 xmlns="http://ns2">value</child21>
                <child22 xmlns="http://ns2">value</child22>
            </child12>

        </parent11>
    </env:Header>
    <env:Body>
        <parent31 xmlns="http://ns3">
            <child31>value</child31>
            <child32>value</child32>

            <child33>
                <parent2 xmlns="http://ns2">
                    <child23>value</child23>
                    <child23>value</child23>
                    <child23>value</child23>
                </parent2>
            </child33>

        </parent31>
    </env:Body>
</env:Envelope>

说明

上层模板删除名称空间前缀 - 例如ns1 - 匹配的元素。

第二个模板是所有其他元素,属性和文本的标识副本

XSLT-Processors自己删除同一名称空间中的子名称空间。