1

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

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

我在互联网上浏览了几篇文章并exclude-result-prefixes在我的 XSLT 开始时使用,我能够摆脱与 Datapower 相关的大多数命名空间,如 dp 和 dpconfig,但xsi:仍然xmlns:出现在我的字符串中。如何摆脱那个也?

请注意,我不能按照几篇文章中的建议使用另一个 XSLT。有没有其他方法,请指教。

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

xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/"
xsi:nil="false"
xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
4

1 回答 1

2

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

<?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" />
于 2013-09-15T23:57:25.760 回答