【发布时间】:2021-04-29 16:58:00
【问题描述】:
一个同步 SOAP Web 服务正在使用一个 xml 文档响应我的请求,该文档具有一个带有空 xmlns 属性 (<element xmlns="">value</element>) 的元素。当然,这会扰乱负责处理此响应的程序。
我想应用 XSL 转换来摆脱空 xmlns 或将其更改为正确的命名空间。 到目前为止,我在此处或其他网站中找到的 XSL 样式表不起作用或使固定元素的子元素现在具有空的 xmlns。 我的输入xml文档如下:
<?xml version="1.0" encoding="utf-8"?>
<rootElement xmlns="http://tempuri.org/">
<level1>
<level2 xmlns="">
<child1 id="aNumber" desc="aString">
<name>name1</name>
<code>code1</code>
</child1>
<child2 desc="aString">
<field1>field1</field1>
<field2>field2</field2>
</child2>
</level2>
</level1>
</rootElement>
到目前为止,我在这里找到的一些 xsl 样式表的最佳输出是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns="http://tempuri.org/">
<level1>
<level2>
<child1 xmlns="" desc="aString" id="aNumber">
<name>name1</name>
<code>code1</code>
</child1>
<child2 xmlns="" desc="aString">
<field1>field1</field1>
<field2>field2</field2>
</child2>
</level2>
</level1>
</rootElement>
level2 是固定的,但现在 child1 和 child 2 都有一个空的 xmlns。这也使我的程序失败。 到目前为止,我得到的最好和最简单的样式表是这个:
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns="http://tempuri.org/">
<xsl:output encoding='UTF-8' indent='yes' method='xml'/>
<!-- copy everything into the output -->
<xsl:template match='@*|node()'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:template>
<!-- change the namespace declaration for level2 -->
<xsl:template match="level2">
<level2 xmlns='http://tempuri.org/'>
<xsl:copy-of select="@*|node()"/>
</level2>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
你为什么说它“当然”在搞乱程序?
xmlns=""在 XML 中是完全正常的。您如何处理响应?也许您只需要调整处理方式即可。 -
嗨。空 xmlns 使 level2 元素及其所有子元素属于另一个命名空间,而不是来自根元素的命名空间。我的程序基于此工作,如果它不属于与根元素相同的命名空间,它就找不到元素 level2。不幸的是,改变程序是不可能的。
-
@juankinspain 空的 xmls 不是 “使 level2 元素及其所有子元素都属于另一个命名空间”。它所做的只是反映这些元素实际上位于另一个名称空间中的事实。它们是由 XML 作者放在那里的。
标签: xml xslt xml-namespaces