Игнорирование «A» и «The» при сортировке с помощью XSLT - PullRequest
3 голосов
/ 17 мая 2010

Я бы хотел отсортировать список, игнорируя любые изначально определенные / неопределенные статьи 'the' и 'a'. Например:

  • Комедия ошибок
  • Гамлет
  • Сон в летнюю ночь
  • Двенадцатая ночь
  • Зимняя сказка

Я думаю, что, возможно, в XSLT 2.0 это может быть достигнуто в соответствии с:

<xsl:template match="/">
  <xsl:for-each select="play"/>
    <xsl:sort select="if (starts-with(title, 'A ')) then substring(title, 2) else
                      if (starts-with(title, 'The ')) then substring(title, 4) else title"/>
    <p><xsl:value-of select="title"/></p>
  </xsl:for-each>
</xsl:template>

Однако я хочу использовать обработку в браузере, поэтому придется использовать XSLT 1.0. Есть ли способ достичь этого в XLST 1.0?

Ответы [ 2 ]

5 голосов
/ 17 мая 2010

Это преобразование :

<xsl:template match="plays">
 <p>Plays sorted by title: </p>
    <xsl:for-each select="play">
      <xsl:sort select=
      "concat(@title
               [not(starts-with(.,'A ') 
                  or 
                   starts-with(.,'The '))],
              substring-after(@title[starts-with(., 'The ')], 'The '),
              substring-after(@title[starts-with(., 'A ')], 'A ')
              )
     "/>
      <p>
        <xsl:value-of select="@title"/>
      </p>
    </xsl:for-each>
</xsl:template>

при применении к этому документу XML :

дает желаемый, правильный результат :

<p>Plays sorted by title: </p>
<p>Barber</p>
<p>The Comedy of Errors</p>
<p>CTA &amp; Fred</p>
<p>Hamlet</p>
<p>A Midsummer Night's Dream</p>
<p>Twelfth Night</p>
<p>The Winter's Tale</p>
2 голосов
/ 17 мая 2010

Вот как бы я это сделал:

<xsl:template match="plays">
    <xsl:for-each select="play">
      <xsl:sort select="substring(title, 1 + 2*starts-with(title, 'A ') + 4*starts-with(title, 'The '))"/>
      <p>
        <xsl:value-of select="title"/>
      </p>
    </xsl:for-each>
</xsl:template>

Обновление : Я забыл добавить 1 к выражению (классическая ошибка off-by-one)

Ну, starts-with - это из XSLT 1.0. Prooflink: первый результат поиска в Google дает XSLT 1.0: функция начинается с

...