针对不在列表中的值的 XSLT 有序列表语法

问题描述 投票:0回答:1

感谢这个网站,我已经能够弄清楚如何在子元素上创建特定的顺序排序(我不经常使用 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 语句都失败了

xml sorting xslt
1个回答
0
投票

(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
至少包含一个字符(此尾随空格),并且该字符越早出现在列表中,长度越长。不在列表中的字段值给出空字符串,因此按降序排在最后。

© www.soinside.com 2019 - 2024. All rights reserved.