xslt排序输出xml [英] xslt sort output xml
问题描述
我正在尝试找到以下问题的解决方案.
I'm trying to find a solution to the following problem.
我正在开发XSLT转换(现在大约40KB),该转换将相当复杂的XML转换为一个非常简单的结构,如下所示:
I'm developing XSLT transformation (which is now about 40KB big) that is transforming quite complex XMLs into a quite simple structure which would like this:
<Records>
<Record key="XX">
</Record>
<Record key="XX1">
</Record>
<Record key="XX2">
</Record>
<Record key="XX3">
</Record>
</Records>
我想让此输出XML根据Records/Record/@key
值排序.
问题是我的XSLT产生的输出未排序,由于其复杂性,我无法在那里进行排序.
是否可以在输出XML上应用xsl:sort
?我知道我可以准备另一个XSLT转换,但就我而言,这不是解决方案,因为我仅限于一个XSLT..请帮助!...
I would like to have this output XML sorted according to Records/Record/@key
values.
The problem is that my XSLT produces this output unsorted and due to its complexity I am unable to sort it there.
Is it possible to apply xsl:sort
on the output XML? I know that I can prepare another XSLT transform, but in my case that's not the solution, as I'm limited to only one XSLT.. Please, help!...
推荐答案
是否可以在输出XML上应用xsl:sort?
Is it possible to apply xsl:sort on the output XML?
是的,可以进行多遍处理 ,尤其是在XSLT 2.0中,您甚至不需要对结果应用xxx:node-set()
扩展名,因为臭名昭著的RTF类型不再存在:
Yes, multipass processing is possible, and especially in XSLT 2.0 you don't even need to apply an xxx:node-set()
extension on the result, because the infamous RTF type does no longer exist:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vPass1">
<!--
Put/Invoke your cirrent code here
to generate the following
-->
<Records>
<Record key="XX3">
</Record>
<Record key="XX2">
</Record>
<Record key="XX4">
</Record>
<Record key="XX1">
</Record>
</Records>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*"/>
</xsl:template>
<xsl:template match="Records">
<Records>
<xsl:perform-sort select="*">
<xsl:sort select="@key"/>
</xsl:perform-sort>
</Records>
</xsl:template>
</xsl:stylesheet>
在任何XML文档(未使用/忽略)上执行此转换时,都会生成想要的,正确的,已排序的结果:
<Records>
<Record key="XX1"/>
<Record key="XX2"/>
<Record key="XX3"/>
<Record key="XX4"/>
</Records>
在XSLT 1.0中,它与将结果从RTF类型额外转换为普通树几乎相同:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="vrtfPass1">
<!--
Put/Invoke your cirrent code here
to generate the following
-->
<Records>
<Record key="XX3">
</Record>
<Record key="XX2">
</Record>
<Record key="XX4">
</Record>
<Record key="XX1">
</Record>
</Records>
</xsl:variable>
<xsl:variable name="vPass1"
select="ext:node-set($vrtfPass1)"/>
<xsl:apply-templates select="$vPass1/*"/>
</xsl:template>
<xsl:template match="Records">
<Records>
<xsl:for-each select="*">
<xsl:sort select="@key"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</Records>
</xsl:template>
</xsl:stylesheet>
这篇关于xslt排序输出xml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!