XSI:名称空间删除

时间:2013-09-14 05:37:00

标签: xml xslt

作为我的要求的一部分,我需要在Datapower工具中路由来自dp:url-open的响应,对其进行序列化,然后将其发送到另一个链接。

问题是响应在其每个元素中都包含如此多的名称空间。我知道它自动生成的格式,但我需要完全删除它们。

我在互联网上发了几篇帖子并在我的XSLT开始时使用了exclude-result-prefixes,我能够摆脱大多数与Datapower相关的dp和dpconfig等命名空间,但xsi:和{{ 1}}仍出现在我的字符串中。如何摆脱那个呢?

请注意,我不能按照几篇帖子中的建议使用其他XSLT。还有其他方法,请建议。

以下是序列化的命名空间。

xmlns:

1 个答案:

答案 0 :(得分:2)

此样式表将生成一个没有任何名称空间的XML文档。使用匹配项的local-name(),使用 xsl:element xsl:attribute 创建所有元素和属性。

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

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="comment() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>

如果您不希望将它们传播到输出中,则可能需要一些其他模板来定位xsi架构实例属性。

例如,当您的源XML中包含以下内容时:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="false" 

它会生成以下 nil 属性:

nil="false"

您可以通过添加与该特定属性匹配的空模板或xsi命名空间的任何属性来阻止这种情况:

<xsl:template match="@xsi:*" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />