如何防止Java XSL转换器插入名称空间前缀?

时间:2018-07-25 18:49:36

标签: java xml xslt

我正在使用javax.xml.transform.Transformer和一个1.0 XSL文档将XML转换为XML。

我正在使用的XSL模板之一是

  • 复制整个子元素及其所有子元素
  • 在此子元素的顶级节点中插入名称空间声明
  • 从子元素中的标记中删除所有名称空间前缀

这是模板的代码:

  <xsl:variable name="replacementNamespace" select="'abc.123.xyz'" />

  <xsl:template match="*" mode="newNamespace">
    <xsl:element name="{local-name()}" namespace="{$replacementNamespace}">
      <xsl:apply-templates select="@*|node()" mode="newNamespace" />
    </xsl:element>
  </xsl:template>

这是我需要的:

<type xmlns="abc.123.xyz">
  <usr></usr>
  etc...
</type>

它正在创建的输出如下:

<ns0:type xmlns:ns0="abc.123.xyz">
  <ns1:usr xmlns:ns1="abc.123.xyz"></usr>
  etc...
</type>

1 个答案:

答案 0 :(得分:0)

XSLT 1.0赋予处理器完全的自由裁量权,以使用他们喜欢在输出中使用的任何名称空间前缀。

如果您的代码与XSLT 2.0处理器一起运行,您的代码应该会达到预期的效果:XSLT 2.0规范对前缀的选择以及采用这种结构更具规范性

<xsl:element name="{local-name()}" 
             namespace="{$replacementNamespace}">

保证您没有前缀。

因此,可以与撒克逊人重试。