按字母数字格式从多个节点排序


        <?xml version="1.0" encoding="UTF-8"?>
<accountList>
    <previousAccount>
        <account>
            <lastName>NASH</lastName>
            <accountStatus>REMOVED</accountStatus>
            <accNo>8D</accNo>
        </account>
        <account>
            <lastName>ADOGA</lastName>
            <accountStatus>REMOVED</accountStatus>
            <accNo>8A</accNo>
        </account>
        <account>
            <lastName>LUCAS</lastName>
            <accountStatus>HOLD</accountStatus>
            <accNo>9A</accNo>
        </account>
        <account>
            <lastName>DONALD</lastName>
            <accountStatus>HOLD</accountStatus>
            <accNo>10D</accNo>
        </account>
        <account>
            <accountStatus>HOLD</accountStatus>
            <lastName>LONDON</lastName>
            <accNo>10B</accNo>
        </account>
    </previousAccount>
    <account>
        <Title>Mr</Title>
        <firstName>RICHARD</firstName>
        <lastName>JOHN</lastName>
        <city>london</city>
        <accNo>5A</accNo>
    </account>
    <account>
        <Title>Mr</Title>
        <firstName>xxx</firstName>
        <lastName>JOHN</lastName>
        <city>London</city>
        <accNo>5D</accNo>
    </account>
    <account>
        <Title>Mr</Title>
        <firstName>HEWIT</firstName>
        <lastName>JOHN</lastName>
        <city>LONDON</city>
        <accNo>20B</accNo>
    </account>
    <account>
        <Title>Mr</Title>
        <firstName>xxx</firstName>
        <lastName>JOHN</lastName>
        <city>LONDON</city>
        <accNo>21D</accNo>
    </account>
    <account>
        <Title>Mr</Title>
        <firstName>KEVIN</firstName>
        <lastName>PETE</lastName>
        <city>LONDON</city>
        <accNo>5F</accNo>
    </account>
</accountList>

XSLT 代码

<xsl:stylesheet version="2.0"
    xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform file:/C:/Users/n434947/Desktop/workspace/SonicXSLT/BA xslt page.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="text"/>
<xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
</xsl:variable>
<xsl:template match="accountList">
    <xsl:for-each-group select="descendant::account" group-starting-with="*[firstName != 'xxx' or lastName != preceding-sibling::*[1]/lastName]">
        <xsl:sort select="accNo" data-type="number"/>
        <xsl:value-of select="accNo"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="accountStatus"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="lastName"/>
        <xsl:value-of select="$newline"/>
    </xsl:for-each-group>
</xsl:template>

在我的要求中,我必须对不同的节点进行排序。我想我会更好地用代码而不是文字来解释这一点, 帐户列表/上一页帐户/帐户/帐户编号 帐户列表/帐户/帐户编号

我使用了后代,这不能很好地满足我的要求。在这里,我对两个节点使用了两个for-each并单独排序。最后但并非最不重要的一点是,我必须按字母数字组合进行排序。

实际输出

    8D REMOVED NASH
    8A REMOVED ADOGA
    9A HOLD LUCAS
    10D HOLD DONALD
    10B HOLD LONDON
    5A  JOHN
    20B  JOHN
    5F  PETE

预期输出

    5A  JOHN
    5F  PETE
    8A REMOVED ADOGA
    8D REMOVED NASH
    9A HOLD LUCAS
    10B HOLD LONDON
    10D HOLD DONALD
    20B  JOHNaccNo will be in sorted manner.

主要问题是无法按字母数字组合(如 2A、2B、3B、3G(进行排序

嗯,

这是一个肮脏的解决方案...使用此函数:

<xsl:function name="px:toInteger" as="xs:double">
    <xsl:param name="value" as="xs:string"/>
    <xsl:variable name="letter" select="replace($value, 'd', '')"/>
    <xsl:variable name="digit" select="xs:integer(replace($value, 'D', ''))" as="xs:integer"/>
    <xsl:variable name="codepoints" select="xs:integer(string-to-codepoints($letter))" as="xs:integer"/>
    <xsl:value-of select="$digit + ($codepoints div 100000)"/>
</xsl:function>

并在 xsl:sort 中调用它:

<xsl:sort select="px:toInteger(accNo)" data-type="number"/>

它仅适用于整数 + 一个字符,例如您的样本。

相关内容

  • 没有找到相关文章

最新更新