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