Алфавитная сортировка с помощью XSLT - PullRequest
0 голосов
/ 05 февраля 2009

Пример XML:

  <term>
  <name>facies</name> 
  <translation language="en">facies</translation> 
  <definition><num>1.</num> cara <num>2.</num> superficie externa, superficie anterior</definition> 
  </term>
  <term>
  <name>factores angiógenos</name> 
  <translation language="en">angiogenic factors</translation> 
  <definition>descripción de sustancias que favorecen el desarrollo o la formación nueva de vasos sanguíneos</definition> 
  </term>
  <term>
  <name>factores de la coagulación</name> 
  <translation language="en">coagulation factors</translation> 
  <definition>la cascada de la coagulación de la sangre consta de 12 factores en total, todos ellos necesarios para que funcione bien</definition> 
  </term>

У меня есть XSLT-файл, который составляет список имен, сопоставленных с именем, и перевод, если таковой существует.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output omit-xml-declaration="yes"/>

  <xsl:template match="terms">

    var allwords = [

    <xsl:for-each select="letter">
      <xsl:for-each select="term">
        <xsl:call-template name="term"></xsl:call-template>
      </xsl:for-each>
    </xsl:for-each>
  ['','']
    ];

  </xsl:template>

  <xsl:template name="term">
    ['<xsl:value-of select="name"/>', '<xsl:value-of select="name"/>'],

    <xsl:if test="name!=translation">
      ['<xsl:value-of select="translation"/>', '<xsl:value-of select="name"/>'],
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Это прекрасно работает, производя следующее

var allwords = 
[ ['facies', 'facies'], 
['factores angiógenos', 'factores angiógenos'],  
['angiogenic factors', factores angiógeno],
['factores de la coagulació', 'factores de la coagulació'] 
etc...

Однако, как вы можете видеть, первая часть в массиве уже не в алфавитном порядке из-за добавления английского слова.

Он должен быть в алфавитном порядке, поэтому в этом случае «ангиогенные факторы» будут первым элементом в массиве

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 05 февраля 2009
Definition and Usage
The <xsl:sort> element is used to sort the output.
Note: <xsl:sort> is always within <xsl:for-each> or <xsl:apply-templates>.

1 голос
/ 07 февраля 2009

Я думаю, что это так просто:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="windows-1252" omit-xml-declaration="yes"/>

  <xsl:template match="/*">
    var allwords = [
    <xsl:apply-templates select="term">
      <!-- key to success -->
      <xsl:sort select="name"/>
    </xsl:apply-templates>
    ];
  </xsl:template>

  <xsl:template match="term">
    ['<xsl:value-of select="name" />', 
    '<xsl:value-of select="translation[@language='en']" />']
    <xsl:if test="position() != last()">,</xsl:if>
  </xsl:template>
</xsl:stylesheet>

Вывод (извините, пришлось убрать «забавные» символы из тестового ввода)

var allwords = [
  ['facies', 'facies'],
  ['factores angiogenos', 'angiogenic factors'],
  ['factores de la coagulacio', 'coagulation factors']
];

(Разрывы строк и отступы немного отличаются в исходном выводе. Я изменил их, чтобы они выглядели хорошо.)

Я думаю, вы не знали о <xsl:sort/>, отмеченном <!-- key to success --> в таблице стилей XSL. ; -)

0 голосов
/ 06 февраля 2009

Вот мое лучшее предположение о том, что вы пытаетесь сделать. Учитывая следующий пример XML:

<terms>
<letter name="f">
    <term>
        <name>facies</name>
        <translation language="en">facies</translation>
        <definition>
            <num>1.</num> cara <num>2.</num> superficie externa, superficie anterior
        </definition>
    </term>
    <term>
        <name>factores angiógenos</name>
        <translation language="en">angiogenic factors</translation>
        <definition>descripción de sustancias que favorecen el desarrollo o la formación nueva de vasos sanguíneos</definition>
    </term>
    <term>
        <name>factores de la coagulación</name>
        <translation language="en">coagulation factors</translation>
        <definition>la cascada de la coagulación de la sangre consta de 12 factores en total, todos ellos necesarios para que funcione bien</definition>
    </term>
</letter>

Сортировка по переводу для каждой буквы:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="terms">
    var allwords = [
        <xsl:apply-templates select="letter">
            <xsl:sort select="name"/>
        </xsl:apply-templates>
    ];
</xsl:template>

<xsl:template match="letter">
    <xsl:apply-templates select="term">
        <xsl:sort select="translation"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="term">
    ['<xsl:value-of select="translation"/>', '<xsl:value-of select="name"/>']
    <xsl:if test="not(position() = last())">
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:template>

0 голосов
/ 05 февраля 2009

Да, нужно немного больше подумать, что просто сортировать: p

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output omit-xml-declaration="yes"/>

  <xsl:template match="terms">

    var allwords = [

      <xsl:for-each select="letter/term/name | letter/term/translation">
        <xsl:sort order="ascending" select="."/>
        <xsl:call-template name="term"></xsl:call-template>
      </xsl:for-each>
  ['','']
    ];

  </xsl:template>

  <xsl:template name="term">
    ['<xsl:value-of select="."/>', '<xsl:value-of select="./../name"/>'],
  </xsl:template>

</xsl:stylesheet>

По сути, вы должны иметь возможность выбрать как имена, так и переводы, а затем отсортировать их по обоим. Затем шаблон нужно было немного отредактировать, поскольку теперь он получает дочерние элементы, а не родительские.

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