XSLT: сортировка как SOLR - PullRequest
       4

XSLT: сортировка как SOLR

0 голосов
/ 26 января 2011

Я использую XSLT для сортировки фрагмента XML, например:

<feed>
   <entry>
      <title>A To Z</title>
   </entry>
   <entry>
      <title>Action</title>
   </entry>
</feed>

XSLT выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:param name="name" select="'title'" />
 <xsl:param name="order" select="'ascending'" />

 <xsl:output method="xml" encoding="UTF-8" indent="yes" />

 <xsl:template match="@* | node()">
  <xsl:copy>
   <xsl:apply-templates select="@* | node()" />
  </xsl:copy>
 </xsl:template>

 <xsl:template match="atom:feed">
  <xsl:copy>
   <xsl:apply-templates select="/atom:feed/*[not(self::atom:entry)]" />
   <xsl:apply-templates select="/atom:feed/atom:entry">
    <xsl:sort select="*[name() = $name]" order="{$order}" />
    <xsl:sort select="atom:id" data-type="number" />
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Я ожидаю, что значения получатся в порядкенапример A To Z, затем Action, но результат содержит противоположное.Было бы похоже, что пробел игнорируется как значение для сортировки.

Ответы [ 2 ]

1 голос
/ 26 января 2011

Эта таблица стилей:

<xsl:stylesheet version="1.0"
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="name" select="'title'" />
    <xsl:param name="order" select="'ascending'" />
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="atom:feed">
        <xsl:copy>
            <xsl:apply-templates select="*[not(self::atom:entry)]" />
            <xsl:apply-templates select="atom:entry">
                <xsl:sort select="*[local-name() = $name]" order="{$order}" />
                <xsl:sort select="atom:id" data-type="number" />
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

С этим вводом ( с объявлением пространства имен ):

<feed xmlns="http://www.w3.org/2005/Atom">
    <entry>
        <title>A To Z</title>
    </entry>
    <entry>
        <title>Action</title>
    </entry>
</feed>

Выход:

<feed xmlns="http://www.w3.org/2005/Atom">
    <entry>
        <title>A To Z</title>
    </entry>
    <entry>
        <title>Action</title>
    </entry>
</feed>

Протестировано с MSXSL 3/4, Saxon, Altova, XQSharp. Примечание : только Oracle, и Xalan сортируют «Действие» перед «А до Я» в порядке возрастания.

0 голосов
/ 26 января 2011

В XSLT 1.0 сортировка определяется реализацией, поэтому вполне возможно, что некоторые реализации игнорируют пространство для сортировки.Какую реализацию вы используете?

Я бы порекомендовал что-то вроде:

<xsl:sort select="translate(*[name() = $name],' ','_')" order="{$order}" />

Может решить вашу проблему (хотя, опять же, зависит от того, как вы реализуете XSLTиспользуя сортировку '_')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...