0

一直在尝试使用 XSLT 转换 XML,但名称空间在转换后继续重新排列。

XML 输入样本

<Document xmlns="uri" xmlns:xsi="url" xsi:schemaLocation="uri file">

改造后变成了这样

<Document xsi:schemaLocation="uri file" xmlns="uri" xmlns:xsi="url">

知道如何使用 XSLT 获得相同的输出吗?

这是我的一些转换,不确定是否有任何影响命名空间

  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

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

  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="text() | processing-instruction() | comment()">
    <xsl:copy />
  </xsl:template>
4

3 回答 3

3

属性的顺序在 XML 中是无关紧要的。从 XML 信息集的角度来看,您的输出与您的输入相同。

参考:http ://www.w3.org/TR/2004/REC-xml-infoset-20040204/#omitted 中的第 10 项

附录 D:信息集中没有的内容

10.开始标签内的属性顺序。

因此,XSLT 无法控制样式表编写器在序列化期间指定属性的顺序。

另请注意,序列化的 XML 输出方法中的第二个项目符号

http://www.w3.org/TR/2007/REC-xslt-xquery-serialization-20070123/#xml-output

“两棵树中属性和命名空间节点的顺序可能不同。”

于 2013-09-05T02:22:13.437 回答
1

Saxon 9.5 引入了一个序列化选项,允许您控制序列化 XML 中属性的顺序。尽管从消费应用程序的角度来看这无关紧要,但它有助于使 XML 更易于人类阅读。但是,该控件不会扩展到命名空间。IIRC Saxon 总是在(其他)属性之前序列化命名空间声明。

于 2013-09-05T08:20:08.580 回答
0
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

此模板对所有属性执行以下模板。

  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

执行顺序可能是这里的问题....

尝试使用<xsl:copy-of select="@*" />而不是应用模板。

于 2013-09-05T02:27:14.130 回答