如何从输出 xml 中删除命名空间?

Posted

技术标签:

【中文标题】如何从输出 xml 中删除命名空间?【英文标题】:How to remove namespace from the output xml? 【发布时间】:2012-03-10 06:41:49 【问题描述】:

下面是我的xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ms="http://www.test.com/schemas/test" 
xmlns:ns="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="ms ns">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<XMLResponse>           
    <xsl:apply-templates select="ms:ProductRS/ms:Product"/>
</XMLResponse>
</xsl:template>
<-- some templates here -->
</xsl:stylesheet>

在输出中我得到如下所示

<?xml version="1.0" encoding="UTF-16"?>
<XMLResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Product>-----</Product>
</XMLResponse>

我需要从 xml 输出中删除 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

【问题讨论】:

您在什么环境中工作,是该 XMLResponse 行中对 xsi 命名空间的唯一引用吗? 为什么需要删除该命名空间?你为什么要这样做? @JohnSaunders 我经常发现接收方系统无法处理 XML 中的命名空间定义。我们无法控制收件人系统代码。有时,接收者可以处理预期的命名空间,但不能处理作为原始 XSLT 一部分的命名空间(例如 xmlns:fn ... xpath-functions),但在 XSLT 之外没有任何用途。 @lafual 查看接受的答案,了解如何省略命名空间。 【参考方案1】:

要排除命名空间,您应该这样表示:-

exclude-result-prefixes="ms ns xsi"

基本上你的样式表是这样的:-

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:ms="http://www.test.com/schemas/test" 
xmlns:ns="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="ms ns xsi">

【讨论】:

或者,如果 xsi 前缀没有在样式表中的任何地方使用,并且在输出中不需要,那么只需删除声明。 但是在“copy-of”上是行不通的(在每个副本上都需要提供 copy-namespaces="no",但我试图找到最好的方法......

以上是关于如何从输出 xml 中删除命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何从杰克逊 XML 解析中删除命名空间定义

如何使用 java dom 从 xml 中删除命名空间?

如何从 WEB API 请求和响应 XML 中删除命名空间?

从 XML 中删除多个 XML 命名空间

如何在 Java 中删除 XML 命名空间

重命名元素的 XSLT 问题——更改命名空间