在XSLT-1.0中是否可以按xml中的值进行排序。在下面的示例中,<examples>请求按<example>字段对year列表进行排序。
...
<examples>
<sortby>year</sortby>
<example>
<year>2012</year>
<number>3</number>
</example>
</examples>
...使用choose的静态条件在这种情况下不起作用,因为我不知道<example>中可能的字段是什么。
发布于 2012-08-07 20:05:04
是,使用以下形式的内容
<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>说明
XSLT的select属性可以包含任何xsl:sort表达式,因此我们可以指定一个表达式来选择要排序的元素的任意子元素,以便其名称是另一个XPath expression.
select之外的所有属性都允许在它们的值中指定**s (属性值模板)。发布于 2012-08-07 20:04:07
按*[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>发布于 2012-08-07 20:04:32
我假设您的意思是排序的节点应该是动态的,从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上运行的演示。
它每年都会输出,每个都是一个段落。根据需要将“降序”更改为“升序”。
https://stackoverflow.com/questions/11845475
复制相似问题