XSL Sort将大写字母与大写字母分开处理

时间:2014-02-25 15:22:54

标签: xml sorting xslt xslt-1.0

我的XSLT按字母顺序排序姓氏,但我注意到有些名字以“de”和“von”或“van”开头。这些小写前缀正在按大写名称排序和放置。如何告诉XSLT将所有案例一起排序?

使用XSLT 1.0

以下是对数据进行排序的部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="Data">
<xsl:strip-space elements="*"/>
<xsl:template match="Data">
<xsl:copy>
<xsl:apply-templates select="Consultant">
<xsl:sort select="Surname" order="ascending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>  
<xsl:template match="Consultant">
<consultant><Surname><xsl:value-of select="Surname"/></Surname>
<FirstName><xsl:value-of select="FirstName"/></FirstName>
<!--…-->
</consultant>
</xsl:template>
</xsl:stylesheet>

以下是一些示例XML:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
<consultant>
<Surname>Arnon</Surname>
<FirstName>Lana</FirstName>
</consultant>
<consultant>
<Surname>von Armon</Surname>
<FirstName>George</FirstName>
</consultant>
<consultant>
<Surname>Arnon</Surname>
<FirstName>Lana</FirstName>
</consultant>
<consultant>
<Surname>de Armon</Surname>
<FirstName>George</FirstName>
</consultant>
</Data>

5 个答案:

答案 0 :(得分:3)

您需要在<xsl:sort/>

中规范化案例

如果您的环境支持XPATH 2.0,那么您可以使用大写()或小写(),如下所示:

<xsl:sort select="upper-case(Surname)" order="ascending" />

如果您的环境不支持XPATH 2.0,那么您需要使用如下所示的translate():

<xsl:sort select="translate(Surname, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" order="ascending" />

答案 1 :(得分:1)

使用translate()是一种黑客攻击,只有当您的处理器不支持lang的{​​{1}}属性时才应该求助 - 请参阅http://www.w3.org/TR/xslt#sorting

答案 2 :(得分:1)

排序取决于您使用的XSLT处理器,包括1.0和2.0。

尝试将lang="nl"(或其他一些合适的语言)添加到xsl:sort元素,以获取该语言的语言敏感排序规则。

答案 3 :(得分:0)

大小写功能仅适用于XSLT 2.0,因此您需要手动完成。插入此低/大写变量,并使用translate

中的xsl:sort执行此操作
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<xsl:sort select="translate(Surname, $smallcase, $uppercase)" order="ascending" />

答案 4 :(得分:0)

如果我理解正确,问题不是小写字母而不是大写字母。你说“面包车”,“德”等等不计算排序。

如果是这样,只需将小写字母翻译为 nothing 即可。

样式表(改编自@ therealmarv的解决方案)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="''" />

    <xsl:template match="Data">
    <xsl:copy>
    <xsl:apply-templates select="consultant">
    <xsl:sort select="translate(Surname, $smallcase, $uppercase)" order="ascending" />
    </xsl:apply-templates>
    </xsl:copy>
    </xsl:template>

    <xsl:template match="consultant">
    <consultant><Surname><xsl:value-of select="Surname"/></Surname>
    <FirstName><xsl:value-of select="FirstName"/></FirstName>
    <!--…-->
    </consultant>
    </xsl:template>
</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<Data>
   <consultant>
      <Surname>von Armon</Surname>
      <FirstName>George</FirstName>
   </consultant>
   <consultant>
      <Surname>de Armon</Surname>
      <FirstName>George</FirstName>
   </consultant>
   <consultant>
      <Surname>Arnon</Surname>
      <FirstName>Lana</FirstName>
   </consultant>
   <consultant>
      <Surname>Arnon</Surname>
      <FirstName>Lana</FirstName>
   </consultant>
</Data>