2016-11-21 57 views
3

我正在复制一个XML文档和属性添加到某些节点 (参见:xslt how to add attributes to copy-ofXSLT:新添加的属性的定位

事情是,我的节点已经有一些现有属性,FE:

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

当我添加一个新的属性,它被定位在第一属性的前面,就是这样:

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

我宁愿它作为最后一个属性,就像这样:

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

有没有一种方法来设置的新“版本”的位置-attribute?感谢您的帮助!

+0

属性顺序无关紧要。你想要做什么? – potame

+0

我的所有同事都习惯了这个顺序,所以如果不是必要的话,我不想改变它。其中一些值可以手动设置,这就是为什么我更喜欢保持订单。我希望添加新的属性作为最后一个属性,请参阅示例。 – brun0

+0

@ brun0您使用哪种特定的处理器? –

回答

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> 
+0

请注意,如果现有'element'已具有'version'属性,则这两个模板规则会有不同的效果。当你写出两个同名的属性时,最后一个获胜。 –

+0

谢谢你们的帮助! – brun0

2

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

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

将确保匹配这些名字中的属性定义的顺序被序列化,其次是不存在列表中的属性。

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