0

我认为我在这里的问题对人们来说可能有点不知所措,所以我试图分块解决。

<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时会产生错误:

捕获:net.sf.saxon.trans.XPathException:不允许将多个项目的序列作为 xsl:sort 的 @select 属性

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

非常感谢您的帮助,因为 XSLT 的重量正在压垮我。

4

1 回答 1

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

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

根据我在您的片段中读到的内容,您真的想按元素名称对孩子进行排序吗?

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

于 2013-09-19T20:54:11.190 回答