【发布时间】:2016-06-22 08:13:56
【问题描述】:
我有以下用于 XML 转换的 xslt 元素。
<xsl:attribute name="{name()}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" namespace="http://www.w3.org/2001/XMLSchema-instance">
<xsl:value-of select="." />
</xsl:attribute>
但是转换后的 XML 如下所示
<TEST xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" ns1:nil="true"/>
而不是 xmlns:nsi 将其更改为 xmlns:ns1 和其他元素 xmlns:ns0
以前有没有人遇到过这个问题。当我转换虽然 eclipse 输出是正确的但如果我使用 java 代码转换它时,它会使用 ns0 ns1 等更改 xmlns 前缀......
以下是我用于转换的 java 代码。
StringWriter sw = new StringWriter();
javax.xml.transform.Result result = new javax.xml.transform.stream.StreamResult(sw);
TransformerFactory transFact = TransformerFactory.newInstance();
Transformer trans = transFact.newTransformer(xsltSource);
trans.transform(xmlSource, result);
经过进一步分析,当我使用独立的 java 程序进行转换时,输出如下(如预期)
<TEST xmlns:nsi="http://www.w3.org/2001/XMLSchema-instance" nsi:nil="true"/>
但如果我在服务器上运行它,输出如下
<TEST xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" ns1:nil="true"/>
xmlns:xsi 被 xmlns:xs1 取代
【问题讨论】:
-
“问题”是什么?命名空间前缀不重要:你指的是那些声明的?
-
我已经更新了原来的问题。请检查最后几行。
-
请显示一个最小但完整的 XML 输入示例和一个最小但完整的 XSLT 样式表,以便我们重现问题,以及您使用的 XSLT 处理器的一些信息(问题被标记为 XSLT 2.0,所以这样做你使用 Saxon 9?)。
-
xsi 和 xs1 引用相同的命名空间(在它们自己的文档中)。命名空间前缀的值并不重要,它们在语义上是相同的命名空间声明。您是否指的是 xsl 中某处的名称空间前缀(因为您通常不应该这样做)
-
我通过 MQ 将此 xml 传递给其他系统。他们指的是它。
标签: java xml xslt-2.0 transformation