Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL 1.0-对不同列表中的列表进行排序_Xslt_Xslt 1.0 - Fatal编程技术网

Xslt XSL 1.0-对不同列表中的列表进行排序

Xslt XSL 1.0-对不同列表中的列表进行排序,xslt,xslt-1.0,Xslt,Xslt 1.0,我是XSL新手,并尝试查看了这里的所有示例,但没有一个与我的问题相匹配 我有一个电影排序列表(从左到右排序) movieF,movieC,movieG 现在我想把这个排序表放在我巨大的电影列表上 <moviesList> <movie>movieA</movie> <movie>movieB</movie> <movie>movieC</movie> <movie>movieD</mo

我是XSL新手,并尝试查看了这里的所有示例,但没有一个与我的问题相匹配

我有一个电影排序列表(从左到右排序)

movieF,movieC,movieG
现在我想把这个排序表放在我巨大的电影列表上

<moviesList>
 <movie>movieA</movie>
 <movie>movieB</movie>
 <movie>movieC</movie>
 <movie>movieD</movie>
 <movie>movieE</movie>
 <movie>movieF</movie>
 <movie>movieG</movie>
 <movie>movieH</movie>
</moviesList>

电影
电影
莫维克
感动
电影
电影
电影
电影
我想要的结果是:

<moviesList>
 <movie>movieF</movie>
 <movie>movieC</movie>
 <movie>movieG</movie>
 <movie>movieA</movie>
 <movie>movieB</movie>
 <movie>movieD</movie>
 <movie>movieE</movie>
 <movie>movieH</movie>
</moviesList>

电影
莫维克
电影
电影
电影
感动
电影
电影
请有人给我一些如何实现这一目标的指导。我尝试创建一个变量$sortlist,然后在其周围添加分隔字符,然后在排序之前使用子字符串。结果是,我的排序列表确实在其他电影之前出现在顶部,但顺序不对。请帮助。

试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="sortlist" select="';movieF;movieC;movieG;'"/>

  <xsl:template match="moviesList">
    <xsl:copy>
      <xsl:for-each select="*[contains($sortlist, concat(';',.,';'))]">
        <xsl:sort select="substring-before($sortlist,concat(';',.,';'))" />
        <xsl:copy-of select="."/>
      </xsl:for-each>
      <xsl:copy-of select="*[not(contains($sortlist, concat(';',.,';')))]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

注意,我没有使用
字符串长度
进行排序,我只是使用字符串本身。XSLT1.0可以按字母顺序排序,而不是按数字排序,这将把14放在7的上方,从而得到movieF、movieG、movieC的顺序

它实际上使用电影名称列表中位于每个名称之前的部分作为排序键;按字母顺序来说,
;电影位于
之前;电影;莫维茨,因此排序时将
movieC
置于
movieG
上方

就我个人而言,我倾向于避免使用逗号作为分隔符,因为它们可以在一些名称中使用,例如“卧虎藏龙”。分号的可能性要小得多,但你可以使用任何你喜欢的角色,只要它不是出现在电影名称中

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="sortlist" select="';movieF;movieC;movieG;'"/>

  <xsl:template match="moviesList">
    <xsl:copy>
      <xsl:for-each select="*[contains($sortlist, concat(';',.,';'))]">
        <xsl:sort select="substring-before($sortlist,concat(';',.,';'))" />
        <xsl:copy-of select="."/>
      </xsl:for-each>
      <xsl:copy-of select="*[not(contains($sortlist, concat(';',.,';')))]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>