XSLT - 删除前缀命名空间特定节点 XML

Posted

技术标签:

【中文标题】XSLT - 删除前缀命名空间特定节点 XML【英文标题】:XSLT - Delete prefix namespace specific node XML 【发布时间】:2016-11-14 12:58:23 【问题描述】:

这是我的带有 SOAP 标头和正文的 XML:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <RequestResponse xmlns="http://tempuri.org/">
            <a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Message>Message text testing.</a:Message>
                <a:Response>false</a:Response>
            </a:RequestResult>
        </RequestResponse>
    </s:Body>
</s:Envelope>

我需要仅删除 RequestResult 节点中的前缀。 从此

 <a:RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

收件人:

 <RequestResult xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting" 
            xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

这是我在版本 2 中使用的XSLT 配置文件

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

    <xsl:output omit-xml-declaration="yes" indent="yes" />

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

    <xsl:template match="/">
        <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
            <s:Body>
                <xsl:apply-templates />
            </s:Body>
        </s:Envelope>
    </xsl:template>

    <xsl:template match="RequestResult |RequestResult//*">
        <xsl:element name="a:name()"
            namespace="http://schemas.datacontract.org/2004/07/Testing">
            <xsl:namespace name="a"
                select="'http://schemas.datacontract.org/2004/07/MockupTesting'" />
            <xsl:namespace name="i"
                select="'http://www.w3.org/2001/XMLSchema-instance'" />
            <!-- <xsl:copy-of select="namespace::*" /> -->
            <xsl:apply-templates select="node()|@*" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

我应该添加或修改什么来删除该节点上的前缀?

【问题讨论】:

您不能“删除”命名空间前缀,而且在绝大多数情况下,您不必做类似的事情。你能解释一下为什么你认为在你的情况下这是必要的吗? 因为我消费的WSDL,需要@Tomalak 对不起,这不是一个令人满意的解释。我问:“你为什么需要它?”你回答“因为我需要它”。我认为你需要给出一个比这更好的理由。 【参考方案1】:

您不能从节点中“删除前缀”。前缀是节点名称的一部分。要删除前缀,您必须使用另一个名称创建一个新节点,并且可能 - 就像在您的示例中一样 - 在另一个命名空间中:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://schemas.datacontract.org/2004/07/MockupTesting">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="a:RequestResult">
    <xsl:element name="RequestResult" namespace="http://tempuri.org/">
        <xsl:copy-of select="namespace::*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

【讨论】:

@gtx911 请不要再讲谜语了。上述转换会产生您要求的精确结果。如果您想要其他内容,请编辑您的问题并澄清。同样的事情也适用于您的其他问题:***.com/a/40589393/3016153

以上是关于XSLT - 删除前缀命名空间特定节点 XML的主要内容,如果未能解决你的问题,请参考以下文章

XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误

xslt 中的 XML 命名空间处理

命名空间删除xml

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

如何使用 XSLT 替换命名空间中的元素?

如何使用 xslt 将父节点命名空间复制到子元素?