XPath 1.0联合中返回属性的顺序

XPath 1.0联合中返回属性的顺序,xpath,Xpath,但仅当每个@begin位于每个@end之前时,因为UNION操作符被指定按文档顺序返回节点。(是吗?) 我需要节点集的顺序相同,即使属性在文档中以不同的顺序出现,如下所示: /merge/text/div/@begin | /merge/text/div/@end 也就是说,我需要元素遵循文档顺序,但每个元素中的属性遵循确定的顺序(指定或按属性名称字母顺序)。这在纯XPath中是不可能的。首先,XML中的属性是无序的。从: 请注意,属性规范在开始标记或 空元素标记不重要 XPath引擎可能

但仅当每个@begin位于每个@end之前时,因为UNION操作符被指定按文档顺序返回节点。(是吗?)

我需要节点集的顺序相同,即使属性在文档中以不同的顺序出现,如下所示:

/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>