XSLT按属性值排序 [英] XSLT sort by attribute value
本文介绍了XSLT按属性值排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个关于如何根据属性值进行排序的问题。
我有以下源文档,我想按照标题类值。
希望有人可以帮助解决这个问题。
< trackList>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Two< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH>资料三< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Four< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH> Data Five< / title>
< / track>
< / trackList>
最终输出应该如下所示:
<曲目>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH>资料三< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH> Data Five< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Four< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Two< / title>
< / track>
< / trackList>
我尝试了以下方法,但无效。
< xsl:for-each-group select =titlegroup-by =@ class>
< xsl:for-each select =current-group()>
< xsl:value-of select =@ class/>
< / xsl:for-each>
< / xsl:for-each-group>
谢谢。
解决方案你可以这样做:
< xsl:stylesheet version =1.0xmlns:xsl = http://www.w3.org/1999/XSL/Transform >
< xsl:output method =xmlindent =yesomit-xml-declaration =yes/>
< xsl:template match =@ * | node()>
< xsl:copy>
< xsl:apply-templates select =@ * | node()/>
< / xsl:copy>
< / xsl:template>
< xsl:template match =trackList>
< xsl:copy>
< xsl:apply-templates select =track>
< xsl:sort select =title / @ class/>
< / xsl:apply-templates>
< / xsl:copy>
< / xsl:template>
< / xsl:stylesheet>
运行您的示例输入时,结果为:
< trackList>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH>资料三< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =SH> Data Five< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Two< / title>
< / track>
<曲目>
< location> http:// localhost / vmydoc< / location>
< title class =STD> Data Four< / title>
< / track>
< / trackList>
I have a question about how to sort based on attribute value.
I have the following source document and I would like to sort the track items by the value of the title class value.
Hopefully someone can help with this.
<trackList>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Two</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Three</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Four</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Five</title>
</track>
</trackList>
The final output should look like this:
<trackList>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Three</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Five</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Four</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Two</title>
</track>
</trackList>
I have tried the following but it does not work.
<xsl:for-each-group select="title" group-by="@class">
<xsl:for-each select="current-group()">
<xsl:value-of select="@class" />
</xsl:for-each>
</xsl:for-each-group>
Thanks.
解决方案
You can do this as follows:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="trackList">
<xsl:copy>
<xsl:apply-templates select="track">
<xsl:sort select="title/@class"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
When run on your sample input, the result is:
<trackList>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Three</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="SH">Data Five</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Two</title>
</track>
<track>
<location>http://localhost/vmydoc</location>
<title class="STD">Data Four</title>
</track>
</trackList>
这篇关于XSLT按属性值排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文