我试图在以下结构中获取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元素,我似乎在转圈圈。
非常感谢任何帮助。
答案 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这样的区号(即多个字母)