XSLT - 使用相同的元素再次排序

时间:2017-05-24 11:55:58

标签: xml sorting xslt

我试图在以下结构中获取XML中所有唯一Locality元素的排序列表

<EXPORT>
    <ESTABLISHMENTS>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>LONDON W2</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>ABERDEEN</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>LONDON E12</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>LONDON E4</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>BIRMINGHAM</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>LONDON E1</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
        <ESTABLISHMENT>
            <LOCATION>
                <LOCALITY>LONDON E1</LOCALITY>
            </LOCATION>
        </ESTABLISHMENT>
    </ESTABLISHMENTS>
</EXPORT>

使用以下XSLT,我能够以alpha排序顺序获取唯一的地点。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="establishment-by-locality" match="ESTABLISHMENTS/ESTABLISHMENT/LOCATION" use="LOCALITY"/>
<xsl:template match="EXPORT">
    <xsl:for-each select="ESTABLISHMENTS/ESTABLISHMENT/LOCATION[count(.| key('establishment-by-locality', LOCALITY)[1]) = 1]">
        <xsl:sort select="LOCALITY"/>
        <xsl:element name="Locality">
            <xsl:value-of select="LOCALITY"/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

但是,如果可能的话,我想通过邮政编码(空格后面的后缀)对伦敦地区进行分类,以提供以下顺序

<Locality>ABERDEEN</Locality>
<Locality>BIRMINGHAM</Locality>
<Locality>LONDON E1</Locality>
<Locality>LONDON E4</Locality>
<Locality>LONDON E12</Locality>
<Locality>LONDON W2</Locality>

收到的实际结果是(注意伦敦E4)

<Locality>ABERDEEN</Locality>
<Locality>BIRMINGHAM</Locality>
<Locality>LONDON E1</Locality>
<Locality>LONDON E12</Locality>
<Locality>LONDON E4</Locality>
<Locality>LONDON W2</Locality>

不幸的是,由于再次依赖Locality元素,我似乎在转圈圈。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

在多种类型中使用相同的元素完全没有问题。你的实际问题是&#34; E12&#34;和&#34; E4&#34;正在按字母顺序排序,当您希望首先按字母排序,然后按数字排序。

这是一个非常粗略的解决方案,但这可以做到......

<xsl:sort select="substring-before(concat(LOCALITY, ' '), ' ')"/>
<xsl:sort select="translate(substring-after(LOCALITY, ' '), '0123456789', '')"/>
<xsl:sort select="translate(substring-after(LOCALITY, ' '), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '')" data-type="number" />

这也将处理像NW10这样的区号(即多个字母)