【问题标题】:XML Transformation from Java changes namespace prefix to ns1 from nsiJava 的 XML 转换将命名空间前缀从 nsi 更改为 ns1
【发布时间】: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 程序进行转换时,输出如下(如预期)

&lt;TEST xmlns:nsi="http://www.w3.org/2001/XMLSchema-instance" nsi:nil="true"/&gt;

但如果我在服务器上运行它,输出如下

&lt;TEST xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" ns1:nil="true"/&gt;

xmlns:xsixmlns:xs1 取代

【问题讨论】:

  • “问题”是什么?命名空间前缀不重要:你指的是那些声明的?
  • 我已经更新了原来的问题。请检查最后几行。
  • 请显示一个最小但完整的 XML 输入示例和一个最小但完整的 XSLT 样式表,以便我们重现问题,以及您使用的 XSLT 处理器的一些信息(问题被标记为 XSLT 2.0,所以这样做你使用 Saxon 9?)。
  • xsi 和 xs1 引用相同的命名空间(在它们自己的文档中)。命名空间前缀的值并不重要,它们在语义上是相同的命名空间声明。您是否指的是 xsl 中某处的名称空间前缀(因为您通常不应该这样做)
  • 我通过 MQ 将此 xml 传递给其他系统。他们指的是它。

标签: java xml xslt-2.0 transformation


【解决方案1】:

您可以尝试使用所需的前缀而不是使用 namespace 属性来显式创建属性 QName:

<xsl:attribute name="xsi:{local-name()}" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     select="."/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2012-09-29
    相关资源
    最近更新 更多