使用xslt删除命名空间

时间:2017-09-10 19:38:46

标签: xml xslt

您好我是xml的新手,我正在使用xslt删除namespaces.Below是输入代码。

<ks6:newRequest xmlns:ks6="http://example.com/connector/ssw" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ks3="com.newtech.kake.notification"
xmlns:ks5="com.newtech.alert" xmlns:ks7="http://notification.newtech.com">
    <ks5:new book = "5073">
        <ks5:entityId>2314</ks5:entityId>
        <ks5:entityName>newReq</ks5:entityName>
    </ks5:new>
    <ks3:new2>
       <ks3:entityId>2315</ks3:entityId>
        <ks3:entityName>newReq2</ks3:entityName>
    </k3:new2>
</ks6:newRequest>

我想要做的是删除命名空间ks6及其URI,即它的xmlns,并使用命名空间ks5而不是ks6。 在这里,我的输出应该如何。

<ks5:newRequest xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ks3="com.newtech.kake.notification"
    xmlns:ks5="com.newtech.alert" xmlns:ks7="http://notification.newtech.com">
        <ks5:new book = "5073">
            <ks5:entityId>2314</ks5:entityId>
            <ks5:entityName>newReq</ks5:entityName>
        </ks5:new>
       <ks3:new2>
           <ks3:entityId>2315</ks3:entityId>
           <ks3:entityName>newReq2</ks3:entityName>
       </k3:new2>
    </ks5:newRequest>

谢谢,

1 个答案:

答案 0 :(得分:0)

使用XSLT,您必须编写与要转换的节点匹配的模板,因为在您的情况下,您希望更改某个命名空间中元素的命名空间,并希望从您需要的其他元素中删除命名空间

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

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

    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="{namespace-uri()}">
            <xsl:copy-of select="namespace::*[not(. = 'http://example.com/connector/ssw')]"/>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="ks6:*" xmlns:ks6="http://example.com/connector/ssw">
        <xsl:element name="ks5:{local-name()}" namespace="com.newtech.alert">
            <xsl:copy-of select="namespace::*[not(. = 'http://example.com/connector/ssw')]"/>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>