我有一个XML文档
<?xml version="1.0" encoding="UTF-8"?>
<document>
<timeperiods>
<timeperiod>
<day>1</day>
<period>1</period>
</timeperiod>
<timeperiod>
<day>1</day>
<period>2</period>
</timeperiod>
<timeperiod>
<day>2</day>
<period>1</period>
</timeperiod>
<timeperiod>
<day>2</day>
<period>2</period>
</timeperiod>
</timeperiods>
</document>我正在申请XSL,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<xsl:apply-templates select="/document/timeperiods">
<xsl:sort select="number(period)" data-type="number" order="descending"/>
<xsl:sort select="number(day)" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="timeperiod">
<xsl:value-of select="concat(period, '-', day, ' ')"/>
</xsl:template>
</xsl:stylesheet>我希望我的模板timeperiod会产生1-1 1-2 2-1 2-2,但是它会导致1-1 2-1 1-2 2-2,这是XML中的原始顺序。
我使用number()函数以及属性data-type和order,但是无论我应用了哪个变体,我总是得到相同的结果。
我在这里错过了什么?
发布于 2022-05-18 08:07:20
要想得到你期望的结果,改变一下:
<xsl:apply-templates select="/document/timeperiods">
<xsl:sort select="number(period)" data-type="number" order="descending"/>
<xsl:sort select="number(day)" data-type="number" order="descending"/>
</xsl:apply-templates>至:
<xsl:apply-templates select="/document/timeperiods/timeperiod">
<xsl:sort select="period" data-type="number" order="ascending"/>
<xsl:sort select="day" data-type="number" order="ascending"/>
</xsl:apply-templates>或者简单地做:
XSLT2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/document">
<xsl:for-each select="timeperiods/timeperiod">
<xsl:sort select="period" data-type="number" order="ascending"/>
<xsl:sort select="day" data-type="number" order="ascending"/>
<xsl:value-of select="period, day" separator="-"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>发布于 2022-05-17 18:14:38
只有一个名为timeperiods的元素,对长度序列进行排序是没有用的。
您希望对timeperiod元素进行排序,因此应该选择这些元素。您还没有给出xsl:apply-templates指令的上下文;显然,这将影响您选择它们的方式。
https://stackoverflow.com/questions/72278758
复制相似问题