XSLT:新添加属性的定位

时间:2016-11-21 12:13:27

标签: xml xslt

我正在复制xml文档并向某些节点添加属性 (见:xslt how to add attributes to copy-of

事实上,我的节点已经有了一些现有属性,例如:

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

当我添加一个新属性时,它会定位在第一个属性的前面,就像那样:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

Saxon(PE和EE)的最新版本具有序列化属性saxon:attribute-order。写作:

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

将确保匹配这些名称的属性按照定义的顺序进行序列化,然后是列表中不存在的属性。

虽然确实不应该将属性顺序视为导致接收软件表现不同的意义上的重要属性,但我同意你的看法,XML的设计目标之一是人类可读,并使用一致性属性顺序有助于实现这一目标。

答案 1 :(得分:1)

XSLT语言没有提供控制属性顺序的方法,因为XML language specification明确指出属性的顺序并不重要。

但是,大多数处理器会按照给出的指令顺序写出属性 - 所以你只需要更改顺序(大概是因为你没有显示当前的代码):

<xsl:template match="element">
    <xsl:copy>
        <xsl:attribute name="version">default</xsl:attribute>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

为:

<xsl:template match="element">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="version">default</xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>