<merge>
<text>
<div begin="A" end="B" />
<div begin="C" end="D" />
<div begin="E" end="F" />
<div begin="G" end="H" />
</text>
</merge>我需要一个属性节点的UNIONed集合,按A、B、C、D、E、F、G、H的顺序排列,这样就可以了:
/merge/text/div/@begin | /merge/text/div/@end但前提是每个@begin都在每个@end之前,因为UNION操作符被指定为按文档顺序返回节点。(是吗?)
我需要节点集具有相同的顺序,即使属性在文档中以不同的顺序出现,如下所示:
<merge>
<text>
<div end="B" begin="A" />
<div begin="C" end="D" />
<div end="F" begin="E" />
<div begin="G" end="H" />
</text>
</merge>也就是说,我需要元素遵循文档顺序,但每个元素中的属性遵循确定的顺序(通过属性名指定或按字母顺序排列)。
发布于 2012-01-06 10:50:56
这在纯XPath中是不可能的。首先,XML中的属性是无序的。从XML 1.0 Recommendation
请注意,开始标记或空元素标记中属性规范的顺序并不重要。
XPath引擎可能会按照它们在文档中出现的顺序读取和存储它们,但就规范而言,这只是一个不可靠的巧合。
其次,XPath没有排序功能。因此,您最好的选择是在选择元素之后,在宿主语言(例如XSLT或通用PL)中对它们进行排序。
下面是如何在XSLT中按值对这些属性进行排序:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates
select="/merge/text/div/@*[name()='begin' or name()='end']">
<xsl:sort select="."/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>请注意,我还将您的两个表达式合并为一个。
编辑:使用以下命令以文档顺序输出开始/结束对(如注释中所述):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="div">
<xsl:value-of select="concat(@begin, @end)"/>
</xsl:template>
</xsl:stylesheet>https://stackoverflow.com/questions/8752666
复制相似问题