XSLT 2.0排序问题:多AccountNo场景下排序报错求助
解决XSLT多AccountNo排序时“排序键值过多”的问题
我之前也踩过这个坑!这种报错一般是因为当目标节点下存在多个<AccountNo>时,XSLT的排序指令默认会把所有匹配到的节点值都当作排序键,而排序操作要求每个条目对应单一排序键值,所以就触发了“排序键值过多”的错误。下面给你两种常见场景的解决方案:
场景1:每个条目对应一个主AccountNo(多AccountNo是冗余/附属)
如果你的XML结构里,每个业务条目(比如<Account>节点)下有多个<AccountNo>,但业务上只需要按其中某一个(比如第一个)排序,那只需要在排序时明确指定取单个节点即可,同时记得加上data-type="number"确保按数字规则排序(避免字符串排序的坑,比如10排在2前面):
示例XML
<Accounts> <Account> <AccountNo>456</AccountNo> <AccountNo>123</AccountNo> <AccountName>商户A</AccountName> </Account> <Account> <AccountNo>789</AccountNo> <AccountName>商户B</AccountName> </Account> </Accounts>
对应XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <SortedAccounts> <!-- 遍历每个Account节点,按第一个AccountNo数字升序排序 --> <xsl:for-each select="Accounts/Account"> <xsl:sort select="AccountNo[1]" data-type="number" order="ascending"/> <xsl:copy-of select="."/> </xsl:for-each> </SortedAccounts> </xsl:template> </xsl:stylesheet>
场景2:每个AccountNo都是独立的排序条目
如果业务上需要把所有<AccountNo>单独作为排序单元(比如每个编号对应一条记录),那需要先把节点扁平化,直接遍历所有<AccountNo>再排序:
对应XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <SortedAccountEntries> <!-- 遍历所有AccountNo节点,按自身数字值排序 --> <xsl:for-each select="//AccountNo"> <xsl:sort select="." data-type="number" order="ascending"/> <AccountEntry> <AccountNumber><xsl:value-of select="."/></AccountNumber> <RelatedAccountName><xsl:value-of select="../AccountName"/></RelatedAccountName> </AccountEntry> </xsl:for-each> </SortedAccountEntries> </xsl:template> </xsl:stylesheet>
关键注意点
- 务必指定
data-type="number":XSLT默认按字符串排序,数字字符串排序会出现逻辑错误(比如"10" < "2")。 - 明确排序键的唯一性:确保每个需要排序的条目对应唯一的排序键值,如果XML结构本身一个条目有多个AccountNo,一定要先明确业务规则(取第一个?取最大/最小值?)再编写排序逻辑。
内容的提问来源于stack exchange,提问作者ar1991
相关产品推荐
相关产品推荐

