XPath 1.0联合中返回属性的顺序
但仅当每个@begin位于每个@end之前时,因为UNION操作符被指定按文档顺序返回节点。(是吗?) 我需要节点集的顺序相同,即使属性在文档中以不同的顺序出现,如下所示:XPath 1.0联合中返回属性的顺序,xpath,Xpath,但仅当每个@begin位于每个@end之前时,因为UNION操作符被指定按文档顺序返回节点。(是吗?) 我需要节点集的顺序相同,即使属性在文档中以不同的顺序出现,如下所示: /merge/text/div/@begin | /merge/text/div/@end 也就是说,我需要元素遵循文档顺序,但每个元素中的属性遵循确定的顺序(指定或按属性名称字母顺序)。这在纯XPath中是不可能的。首先,XML中的属性是无序的。从: 请注意,属性规范在开始标记或 空元素标记不重要 XPath引擎可能
/merge/text/div/@begin | /merge/text/div/@end
也就是说,我需要元素遵循文档顺序,但每个元素中的属性遵循确定的顺序(指定或按属性名称字母顺序)。这在纯XPath中是不可能的。首先,XML中的属性是无序的。从: 请注意,属性规范在开始标记或 空元素标记不重要 XPath引擎可能会按照它们在文档中出现的顺序读取和存储它们,但就规范而言,这只是一个不可靠的巧合 其次,XPath没有排序功能。因此,您最好的选择是在选择元素后,对宿主语言中的元素(例如XSLT或通用PL)进行排序 以下是如何在XSLT中按值对这些属性进行排序:
<merge>
<text>
<div end="B" begin="A" />
<div begin="C" end="D" />
<div end="F" begin="E" />
<div begin="G" end="H" />
</text>
</merge>
请注意,我还将您的两个表达式合并为一个
编辑:使用以下命令以文档顺序输出开始/结束对(如注释中所述):
不是我想要的答案,而是我想要的答案。我将把这个问题交给XSLT主持人。@JPM-我可以在这里发布XSLT解决方案。一分钟。这将按属性值排序,对吗?我需要开始结束开始结束。。。即使值排序不正确,也要排序。(我不应该在我的例子中使用ABCDEFGH。)结果还没有输出。我需要可以通过param select表达式传入的节点集。如果我可以传递一个开始-结束对的节点集,那可能会有用。@JPM-好的,我建议将此作为一个单独的问题发布在XSLT标记中,这样我们就不会在这里来回了。张贴这些确切的要求,我肯定你会得到一个很好的答案。
<merge>
<text>
<div end="B" begin="A" />
<div begin="C" end="D" />
<div end="F" begin="E" />
<div begin="G" end="H" />
</text>
</merge>
<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>