使用XSLT进行复制时删除XML命名空间

时间:2015-11-17 08:01:46

标签: java xml xslt

这是我的XSLT:

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:urn="urn:jboss:domain:3.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="//urn:socket-binding-group">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
            <urn:socket-binding name="https" port="${{jboss.https.port:8443}}"/>
        </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>

我想转换这个XML文件:

<server xmlns="urn:jboss:domain:3.0">
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    </socket-binding-group>
</server>

就像:

<server xmlns="urn:jboss:domain:3.0">
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    </socket-binding-group>
</server>

但转换的结果是:

<server xmlns="urn:jboss:domain:3.0">
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <urn:socket-binding xmlns:urn="urn:jboss:domain:3.0" name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
    </socket-binding-group>
</server>

它有一些额外的xmlns属性。知道如何解决它吗?

1 个答案:

答案 0 :(得分:2)

命名空间声明只有很小的变化,这里是修改后的xslt

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="urn:jboss:domain:3.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="//*:socket-binding-group">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
            <socket-binding name="https" port="${{jboss.https.port:8443}}"/>
        </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>