我正在尝试根据“title”元素中的数字选择元素,然后按特定顺序返回它们。我使用密钥对它们进行了分组,但是当我访问密钥并将模板应用到节点时,它们不会按指定的顺序返回。
示例代码:
<test>
<anElement>
<title>001 title</title>
</anElement>
<anElement>
<title>002 title</title>
</anElement>
<anElement>
<title>003 title</title>
</anElement>
<anElement>
<title>004 title</title>
</anElement>
<anElement>
<title>005 title</title>
</anElement>
<anElement>
<title>006 title</title>
</anElement>
<anElement>
<title>007 title</title>
</anElement>
<anElement>
<title>008 title</title>
</anElement>
<anElement>
<title>009 title</title>
</anElement>
<anElement>
<title>010 title</title>
</anElement>
</test>
转换为:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="keyNodes" match="//anElement" use="title/substring(., 1, 3)"/>
<xsl:template match="/">
<groupsOfNodes>
<aGroup>
<title>group one</title>
<members>
<xsl:apply-templates select="key('keyNodes', ('003', '002', '001'))"/>
</members>
</aGroup>
<aGroup>
<title>group one</title>
<members>
<xsl:apply-templates select="key('keyNodes', ('010', '009', '008'))"/>
</members>
</aGroup>
</groupsOfNodes>
</xsl:template>
<xsl:template match="anElement">
<para><xsl:apply-templates/></para>
</xsl:template>
</xsl:stylesheet>
给出了这个结果:
<groupsOfNodes>
<aGroup>
<title>group one</title>
<members>
<para>001 title</para>
<para>002 title</para>
<para>003 title</para>
</members>
</aGroup>
<aGroup>
<title>group one</title>
<members>
<para>008 title</para>
<para>009 title</para>
<para>010 title</para>
</members>
</aGroup>
</groupsOfNodes>
以下是所需结果的示例:
<members>
<para>003 title</para>
<para>002 title</para>
<para>001 title</para>
</members>
有没有办法指定他们处理的顺序,还是我必须为密钥中的每个节点使用单独的“apply-template”规则?
答案 0 :(得分:1)
您可以将代码更改为
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="keyNodes" match="anElement" use="title/substring(., 1, 3)"/>
<xsl:template match="/">
<groupsOfNodes>
<aGroup>
<title>group one</title>
<members>
<xsl:apply-templates select="for $s in ('003', '002', '001') return key('keyNodes', $s)"/>
</members>
</aGroup>
<aGroup>
<title>group one</title>
<members>
<xsl:apply-templates select="for $s in ('010', '009', '008') return key('keyNodes', $s)"/>
</members>
</aGroup>
</groupsOfNodes>
</xsl:template>
<xsl:template match="anElement">
<para><xsl:apply-templates/></para>
</xsl:template>
</xsl:stylesheet>
当您使用XSLT 2.0时,我也想知道为什么使用密钥进行分组,但这是一个不同的问题。