Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT:新添加属性的定位_Xml_Xslt - Fatal编程技术网

Xml XSLT:新添加属性的定位

Xml XSLT:新添加属性的定位,xml,xslt,Xml,Xslt,我正在复制一个xml文档并向某些节点添加属性 (见:) 问题是,我的节点已经有一些现有属性,例如: <element id="123" dbfield="table"> 当我添加一个新属性时,它会定位在第一个属性的前面,如下所示: <element version="default" id="123" dbfield="table"> 我希望将其作为最后一个属性,如下所示: <element id="123" dbfield="table" versi

我正在复制一个xml文档并向某些节点添加属性 (见:)

问题是,我的节点已经有一些现有属性,例如:

<element id="123" dbfield="table">

当我添加一个新属性时,它会定位在第一个属性的前面,如下所示:

<element version="default" id="123" dbfield="table">

我希望将其作为最后一个属性,如下所示:

<element  id="123" dbfield="table" version="default">


有没有办法设置新“版本”属性的位置?谢谢你的帮助

XSLT语言没有提供控制属性顺序的方法,因为XSLT语言明确表示属性顺序不重要

尽管如此,大多数处理器都会按照给定的指令顺序写出属性,因此您只需更改以下顺序(大概是因为您没有显示当前代码):


违约
致:


违约
最近版本的Saxon(PE和EE)具有序列化属性
Saxon:attribute order
。写作:

<xsl:output saxon:attribute-order="id dbfield version"/>

将确保按照定义的顺序序列化与这些名称匹配的属性,后跟列表中不存在的属性


虽然您确实不应该将属性顺序视为导致接收软件行为不同的重要因素,但我同意您的观点,即XML的设计目标之一是可读性,并且使用一致的属性顺序有助于实现这一目标。

属性顺序并不重要。你到底想做什么?我所有的同事都习惯了这个命令,所以如果没有必要,我不想改变它。其中一些值会不时地手动设置,这就是为什么我更喜欢保持顺序。我希望添加新属性作为最后一个属性,请参见示例。@brun0您使用哪个特定处理器?@michael.hor257k SaxonHE9-2-0-6j@brun0那么我相信我的答案会对您有用。请注意,如果现有的
元素
已经具有
版本
属性,那么这两个模板规则的效果不同。当您使用相同的名称编写两个属性时,最后一个属性将获胜。感谢您的帮助!
<xsl:template match="element">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="version">default</xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
<xsl:output saxon:attribute-order="id dbfield version"/>