转换时按顺序显示命名空间

时间:2013-09-05 02:02:09

标签: xml xslt

尝试使用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>

3 个答案:

答案 0 :(得分:3)

属性的顺序与XML无关。您的输出与XML信息集透视图中的输入相同。

参考:http://www.w3.org/TR/2004/REC-xml-infoset-20040204/#omitted

中的第10项
  

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

     

10. start-tag中属性的顺序。

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

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

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

  

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

答案 1 :(得分:1)

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

答案 2 :(得分: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="@*" />代替apply-templates。