使用XSLT按字母顺序排序

时间:2009-02-05 10:34:35

标签: xslt sorting

示例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文件,它创建一个映射到name的名称列表,以及一个存在的翻译。

<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 个答案:

答案 0 :(得分:2)

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>.

<xsl:sort>

答案 1 :(得分:1)

我认为就这么简单:

<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/>,在XSL样式表中标有<!-- key to success -->。 ; - )

答案 2 :(得分:0)

是的,需要多一点思考才能排序: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>

基本上,您需要能够选择名称和翻译,然后按两者进行排序。然后必须对模板进行一些编辑,因为它现在正在接收子元素而不是父元素。

答案 3 :(得分:0)

这是我对你要做的事情的最好猜测。给出以下示例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>