我的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>
答案 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>