感谢这个网站,我已经能够弄清楚如何在子元素上创建特定的顺序排序(我不经常使用 XSLT)。
我遇到的问题是,当某些内容不在该列表中时,它不再尊重任何排序。
期望的结果是让 5 个定义的子元素始终以特定顺序位于顶部,其他任何元素都会出现在后面,因为每天都会创建数百种可能性。之后的任何内容的排序并不重要,重要的是定义的 5 个始终位于顶部。
列出所有元素值时的 XML 示例:
<Root>
<Parent>
<Child>
<FieldValue>SAMPLE1</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE2</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE3</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE4</FieldValue>
</Child>
</Parent>
</Root>
XSLT
<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:param name="pSortingValues" select="'SAMPLE2,SAMPLE1,SAMPLE4,SAMPLE3'"/>
<xsl:variable name="vSortingValues" select=
"concat(',', $pSortingValues, ',')"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*">
<xsl:sort data-type="number" select=
"string-length(substring-before($vSortingValues,concat(',',Child/FieldValue,',')))"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果
<Root>
<Parent>
<Child>
<FieldValue>SAMPLE2</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE1</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE4</FieldValue>
</Child>
</Parent>
<Parent>
<Child>
<FieldValue>SAMPLE3</FieldValue>
</Child>
</Parent>
</Root>
任何想法将不胜感激,到目前为止我还没有成功。我尝试使用变量和 if 语句都失败了
(XSLT 1.0)
如果未找到字段值,则string-length(substring-before(...))
为 0。如果您希望在末尾添加此类条目,请使用
<xsl:variable name="vSortingValues"
select="concat(',', $pSortingValues, ', ')"/>
和
<xsl:sort select="string-length(substring-after(...))" order="descending"/>
相反。如果找到字段值,
$vSortingValues
末尾的额外空格可确保 substring-after
至少包含一个字符(此尾随空格),并且该字符越早出现在列表中,长度越长。不在列表中的字段值给出空字符串,因此按降序排在最后。