Xslt 自定义排序XSL?
这是我的XML结构,如下所示 输入:-Xslt 自定义排序XSL?,xslt,sorting,Xslt,Sorting,这是我的XML结构,如下所示 输入:- <MYDATA> <DETAILS> <DESCRIPTION>EASE</DESCRIPTION> </DETAILS> <DETAILS> <DESCRIPTION>COMPLEX</DESCRIPTION> </DETAILS> <DETAILS>
<MYDATA>
<DETAILS>
<DESCRIPTION>EASE</DESCRIPTION>
</DETAILS>
<DETAILS>
<DESCRIPTION>COMPLEX</DESCRIPTION>
</DETAILS>
<DETAILS>
<DESCRIPTION>SIMPLE</DESCRIPTION>
</DETAILS>
</MYDATA>
缓解
复杂的
简单的
我想用xsl排序显示,这意味着自定义排序,我想显示第一个简单的第二个简单的第三个复杂的
输出:-
<MYDATA>
<DETAILS>
<DESCRIPTION>SIMPLE</DESCRIPTION>
</DETAILS>
<DETAILS>
<DESCRIPTION>EASE</DESCRIPTION>
</DETAILS>
<DETAILS>
<DESCRIPTION>COMPLEX</DESCRIPTION>
</DETAILS>
</MYDATA>
简单的
缓解
复杂的
如果您知道所有可能的值,您可以执行一系列特定于条件的应用模板
调用:
<xsl:apply-templates select="Details[Description = 'Simple']" />
<xsl:apply-templates select="Details[Description = 'Ease']" />
<xsl:apply-templates select="Details[Description = 'Complex']" />
因此,如果您知道希望它们的顺序,并且潜在的选项不会改变,那么它将以apply templates
规则设置的任何顺序输出它们
当然,如果它比这更复杂,您可以考虑在数据面上存储排序顺序,并将其包含在XSL中,这样就可以排序。
< P>有一个通用的方法来解决这个问题。 您需要的是用您想要使用的排序列表定义一个变量。 然后使用递归调用按顺序显示元素。 基本上,通过变量“sortOrder”的元素,然后应用到使用该值的应用模板调用,选择所需的节点 <?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="sortOrder">EASE|SIMPLE|COMPLEX|</xsl:variable>
<xsl:template match="/">
<MYDATA>
<xsl:call-template name="SortElements">
<xsl:with-param name="sortList" select="$sortOrder"/>
</xsl:call-template>
</MYDATA>
</xsl:template>
<xsl:template name="SortElements">
<xsl:param name="sortList"/>
<xsl:variable name="element" select="substring-before ($sortList, '|')"/>
<xsl:if test="$element != ''">
<xsl:apply-templates select="/MYDATA/DETAILS [DESCRIPTION = $element]"/>
<xsl:call-template name="SortElements">
<xsl:with-param name="sortList" select="substring-after ($sortList, '|')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="DETAILS">
<DETAILS>
<DESCRIPTION>
<xsl:value-of select="DESCRIPTION"/>
</DESCRIPTION>
</DETAILS>
</xsl:template>
</xsl:stylesheet>
轻松|简单|复杂|
从Jose的想法开始,这里有一些代码更少的东西:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="DifficultyLevel">EASE|SIMPLE|COMPLEX|</xsl:variable>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="MYDATA">
<xsl:apply-templates select="@* | node()">
<xsl:sort order="ascending" select="string-length(substring-before($DifficultyLevel, DETAILS/DESCRIPTION))"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
轻松|简单|复杂|
您知道,子元素在XML中都是同一级别的。首先获取的元素取决于XML解析器。有些解析xml文件是自下而上的…所以在这种情况下“简单”是第一个。如果在xml中确实需要排序顺序,则需要指定某种索引(作为属性)。@fmuecke-WTF?XML本质上是有序的,所以不需要这样做。真的吗?我不太确定。我希望看到这个问题得到解决,我需要使用类型列表进行排序。我想使用循环使代码更具元素性。哇,这太棒了,正是我所需要的!!不要忘记在排序中添加data type=“number”,否则它将按文本排序(例如6>32)。。。。