首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联合中返回属性的XPath 1.0顺序

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

Stack Overflow用户
提问于 2012-01-06 10:21:43
回答 1查看 1.8K关注 0票数 6
代码语言:javascript
复制
<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的顺序排列,这样就可以了:

代码语言:javascript
复制
/merge/text/div/@begin | /merge/text/div/@end

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

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

代码语言:javascript
复制
<merge>
    <text>
        <div end="B"   begin="A" />
        <div begin="C" end="D"   />
        <div end="F"   begin="E" />
        <div begin="G" end="H"   />
    </text>
</merge>

也就是说,我需要元素遵循文档顺序,但每个元素中的属性遵循确定的顺序(通过属性名指定或按字母顺序排列)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-06 10:50:56

这在纯XPath中是不可能的。首先,XML中的属性是无序的。从XML 1.0 Recommendation

请注意,开始标记或空元素标记中属性规范的顺序并不重要。

XPath引擎可能会按照它们在文档中出现的顺序读取和存储它们,但就规范而言,这只是一个不可靠的巧合。

其次,XPath没有排序功能。因此,您最好的选择是在选择元素之后,在宿主语言(例如XSLT或通用PL)中对它们进行排序。

下面是如何在XSLT中按值对这些属性进行排序:

代码语言:javascript
复制
<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>

请注意,我还将您的两个表达式合并为一个。

编辑:使用以下命令以文档顺序输出开始/结束对(如注释中所述):

代码语言:javascript
复制
<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>
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8752666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档