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

19

以下是我的 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 命名空间的吗? - Joachim Isaksson
为什么你需要移除那个命名空间?你想要做什么? - John Saunders
@JohnSaunders 我经常发现接收系统无法处理XML中的命名空间定义。我们无法控制接收系统代码。有时,接收方可以处理预期的命名空间,但不能处理原始XSLT中的命名空间(例如xmlns:fn ... xpath-functions),因为它们在XSLT之外没有任何作用。 - lafual
请参考被接受的答案,了解如何省略命名空间。 - John Saunders
1个回答

49

要排除一个命名空间,应该这样表示:

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">

1
或者,如果在样式表中没有使用xsi前缀,并且不希望在输出中出现,则只需删除该声明。 - Michael Kay
1
但是在“copy-of”上它不起作用( 在每个“copy-of”上都需要提供“copy-namespaces =” no“,但我正在尝试寻找最佳方法... - antoniOS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接