【发布时间】:2020-02-04 19:07:17
【问题描述】:
我想按属性top 的值对所有<text> 元素进行排序。
但是,只有当元素的前一个兄弟元素的值 top 超过其自身 2 个或更多单位时,才应对元素进行排序。
例如以下元素
<text top="100">text 1</text>
<text top="99">text 2</text>
<text top="100">text 3</text>
<text top="99">text 4</text>
<text top="35">text 5</text>
<text top="40">text 6</text>
应该转化为:
<text top="35">text 5</text>
<text top="40">text 6</text>
<text top="100">text 1</text>
<text top="99">text 2</text>
<text top="100">text 3</text>
<text top="99">text 4</text>
这样组:
<text top="100">text 1</text>
<text top="99">text 2</text>
<text top="100">text 3</text>
<text top="99">text 4</text>
排序后保持原样。
我只是偶尔使用XSLT,只知道常用的排序方式:
<xsl:for-each select="text">
<xsl:sort select="@top" />
<xsl:copy>
<xsl:copy-of select="./node()|./@*" />
</xsl:copy>
</xsl:for-each>
但我想要达到的结果需要某种冒泡排序。
不确定纯 XSLT 是否可行。 我有一个 XSLT 2.0 处理器。
【问题讨论】:
-
“只有当元素的前一个兄弟元素的 top 值超过它自己的 2 个或更多单位时,才应该对元素进行排序。” 这不是一个完整的规则,恕我直言。 (仅)对符合条件的元素进行排序很容易。问题是在哪里放置排序的序列。在您的示例中,它位于顶部 - 我不知道为什么。
-
P.S.请说明您可以使用哪个版本的 XSLT。
-
@michael.hor257k 我不确定如何更准确地描述排序规则。也许我可以说,那些顶部值仅相差 1 个单位的相邻
元素组应该在排序期间保持原样?...按顶部属性值排序应该按升序排列。 -
相邻的分组条件可以很容易地转换为 XQuery 3.1,我认为有一个滚动窗口,然后,如果我理解正确的要求,您可以将每个组存储在最小
@top服务的地图中作为地图键,最后您可以按该键对地图序列进行排序,然后删除地图并单独返回项目。查看xqueryfiddle.liberty-development.net/pPqteB5/2、xqueryfiddle.liberty-development.net/pPqteB5/1、xqueryfiddle.liberty-development.net/pPqteB5/0 中的示例是否给出了预期的结果。 XQuery 3.1 在 Saxon 9.8+ 中可用 -
投反对票,因为规范完全不完整。
标签: xslt xslt-2.0 xslt-grouping