XSLT通过<xsl:sort>元素实现XML排序,可结合select、order、data-type和lang属性按文本、数字或语言规则排序,支持多级排序及空值、特殊字符处理,灵活应对复杂数据组织需求。

用XSLT对XML进行排序,说起来这事儿其实挺直观的,核心就那么一个
<xsl:sort>
要实现XML排序,你需要在XSLT的模板规则内部,通常是紧接着
<xsl:apply-templates>
<xsl:for-each>
<xsl:sort>
我们拿一个简单的书籍列表XML为例:
<library>
<book>
<title>The Hitchhiker's Guide to the Galaxy</title>
<author>Douglas Adams</author>
<year>1979</year>
</book>
<book>
<title>1984</title>
<author>George Orwell</author>
<year>1949</year>
</book>
<book>
<title>Brave New World</title>
<author>Aldous Huxley</author>
<year>1932</year>
</book>
<book>
<title>Dune</title>
<author>Frank Herbert</author>
<year>1965</year>
</book>
</library>现在,假设我们想按书名(title)的字母顺序来排序这些书:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/library">
<sortedBooks>
<xsl:for-each select="book">
<xsl:sort select="title" order="ascending" data-type="text"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</sortedBooks>
</xsl:template>
</xsl:stylesheet>运行这段XSLT,你会得到一个按书名首字母排序的新XML结构。
select
order
data-type
这可不是简单地按字母顺序排排队那么粗暴。很多时候,我们面对的是数字、日期,甚至是不同语言的文本。XSLT的
<xsl:sort>
data-type
lang
data-type
year
text
number
<xsl:sort select="year" data-type="number" order="descending"/>
lang
lang
lang
lang="de"
lang="zh"
想象一下,你不仅仅想按书名排序,还想在书名相同的情况下,再按作者排序。或者,先按出版年份降序排列,年份相同的再按书名升序排列。这种“先排这个,再排那个”的需求,在XSLT里处理起来异常优雅。
你只需要在
<xsl:for-each>
<xsl:apply-templates>
<xsl:sort>
<xsl:sort>
<xsl:sort>
继续用我们的图书馆例子,如果我想先按年份降序排列,年份相同的书再按书名升序排列:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/library">
<sortedBooks>
<xsl:for-each select="book">
<!-- 第一级排序:按年份降序 -->
<xsl:sort select="year" data-type="number" order="descending"/>
<!-- 第二级排序:年份相同的话,按书名升序 -->
<xsl:sort select="title" data-type="text" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</sortedBooks>
</xsl:template>
</xsl:stylesheet>这段XSLT会先找出最新的书,如果有多本是同一年出版的,它就会在这些同龄书中,再按书名的字母顺序进行排列。这种多级排序的能力,让XSLT在处理复杂数据组织时显得非常灵活和强大。
在真实的数据世界里,数据往往不是那么规整。有时候你会发现,某些数据节点压根儿就没有值(比如某个
book
author
空值处理: 当
<xsl:sort>
一个常见的技巧是使用
xsl:choose
xsl:if
<xsl:sort select="concat(string(author), 'ZZZZZ')" data-type="text"/>
这里
'ZZZZZ'
author
'ZZZZZ'
number(boolean(author))
特殊字符和非ASCII字符: 对于特殊字符,比如标点符号、数字混合文本,XSLT的默认文本排序会遵循Unicode编码的顺序。这意味着,例如"!"会排在"A"之前,数字字符"1"会排在"A"之前。如果你的需求是更自然的语言排序(比如数字字符串"10"排在"2"之后,而不是之前),你就需要确保
data-type
number
总的来说,XSLT的排序功能虽然强大,但在处理不规范数据时,也需要我们多一份心眼,根据实际需求灵活运用其属性,甚至结合一些XPath函数来“预处理”数据,才能得到最符合预期的结果。这就像是给一堆形状各异的积木分类,你得先知道它们是按颜色分,还是按大小分,还是先按颜色再按大小。
以上就是如何使用XSLT对XML进行排序操作?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号