根据子元素的文本在其兄弟元素中对父元素进行排序

时间:2013-09-19 20:09:45

标签: xslt xpath saxon

我认为我的问题here可能对人们来说有点压倒性,所以我试图以大块的方式来解决它。

<xsl:apply-templates mode="sort">
    <xsl:sort select="name()"/>
    <xsl:sort select="./*"/>
    <xsl:sort data-type="text" select="./*[text()]"/>
</xsl:apply-templates>

第一个sort语句<xsl:sort select="name()"/>有效且我理解。

第二个sort语句<xsl:sort select="./*"/>似乎几乎完全符合我的要求,但它不会考虑子节点的text()。我真的不明白为什么这个sort语句正在做它正在做的事情。添加它只是解决我问题的众多尝试之一。

第三个sort语句<xsl:sort data-type="text" select="./*[text()]"/>是我尝试选择第二个sort语句停止的位置。它不起作用,并在使用Saxon-HE 9.4时生成错误:

  

Caught:net.sf.saxon.trans.XPathException:一个多个序列   item不允许作为xsl:sort

的@select属性

我在这里尝试做的是根据子元素的文本在其兄弟之间正确排序父元素。

由于XSLT的重量让我很沮丧,所以非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

<xsl:apply-templates select="*">
  <xsl:sort select="."/>
</xsl:apply-templates>

上面的代码将获取当前节点的所有子元素节点,按文本值对它们进行排序,然后按文本排序顺序将它们推送到模板规则。

从我在你的代码片段中看到的内容,你真的想按照元素名称对孩子进行排序吗?

您几乎不必处理text()个节点...元素的值是其所有后代text()节点的串联。