在XSLT-1.0中是否可以按xml中的值进行排序。在下面的示例中,<examples>
已请求<example>
列表按year
字段排序。
...
<examples>
<sortby>year</sortby>
<example>
<year>2012</year>
<number>3</number>
</example>
</examples>
...
静态条件使用选择在这种情况下不起作用,因为我不知道<example>
中可能的字段是什么。
答案 0 :(得分:1)
是的,请使用此表单:
<xsl:apply-templates select="example">
<xsl:sort select="*[name()=sortby]" data-type="{sort-data-type}"
order="{sort-order}" />
</xsl:apply-templates>
请注意您还需要指定排序数据类型和顺序。
完整示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="example">
<xsl:sort select="*[name()=/*/sortby]" data-type="{/*/sort-data-type}"
order="{/*/sort-order}" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="example">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<examples>
<sortby>year</sortby>
<sort-data-type>number</sort-data-type>
<sort-order>descending</sort-order>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
产生了想要的正确结果:
<examples>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
<example>
<year>2008</year>
<number>3</number>
</example>
</examples>
如果对此XML文档应用了相同的转换(与上面相同,但更改为sortby
和sort-order
):
<examples>
<sortby>number</sortby>
<sort-data-type>number</sort-data-type>
<sort-order>ascending</sort-order>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
然后再次生成想要的正确结果:
<examples>
<example>
<year>2012</year>
<number>2</number>
</example>
<example>
<year>2008</year>
<number>3</number>
</example>
<example>
<year>2010</year>
<number>5</number>
</example>
</examples>
<强>解释强>:
select
的{{1}}属性可以包含任何XPath表达式,因此我们可以指定一个表达式来选择要排序的元素的任何子元素,这样它的名称就是评估另一个XPath表达式。
在XSLT中,通常,xsl:sort
以外的所有属性都允许在其值中指定* AVT * s(属性值模板)。
答案 1 :(得分:0)
按*[local-name() = $your-sort-item]
排序,例如
<xsl:template match="examples">
<xsl:variable name="sort-name" select="sortby"/>
<xsl:apply-templates select="example">
<xsl:sort select="*[local-name() = $sort-name]"/>
</xsl:apply-templates>
</xsl:template>
答案 2 :(得分:0)
我假设您的意思是您排序的节点应该是动态的,从examples/sortBy
节点读取。情况就是这样:
<xsl:template match="examples">
<xsl:apply-templates select='example'>
<xsl:sort
select='*[name() = /examples/sortby]'
data-type='number'
order='descending'
/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match='example'>
<p><xsl:value-of select='year' /></p>
</xsl:template>
this XML Playground上的Runnable演示。
每年输出一次作为一个段落。根据需要将“降序”更改为“升序”。