2009-02-05 4 views
0

XML Exemple:tri alphabétique avec XSLT

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

J'ai un fichier XSLT qui fait une liste des noms mis en correspondance avec le nom, et une traduction si l'on existe.

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

Cela fonctionne très bien, produisant ce qui suit

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

Cependant, comme vous pouvez voir la première partie du tableau est pas dans l'ordre alphabétique plus, en raison de l'ajout du mot anglais .

Il doit être dans l'ordre alphabétique, dans ce cas « facteurs angiogéniques » serait le premier élément du tableau

Toutes les idées?

Répondre

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>

0

Oui, a besoin d'un peu plus pensé que quelque sorte: 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> 

Fondamentalement, vous devez être en mesure de sélectionner les noms et les traductions, puis trier par les deux leur. Ensuite, le modèle a dû être édité un peu, car il recevait maintenant les éléments enfants plutôt que le parent.

+0

Aucun de ces modèles ne correspond à votre schéma. Aussi "for-each" n'est pas l'élément approprié pour ce que vous essayez de faire - "apply-templates" est la construction pertinente. – Ishmael

0

Voici ma meilleure estimation de ce que vous essayez de faire. Compte tenu de l'XML exemple suivant:

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

Trier sur la traduction pour chaque lettre:

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

1

Je pense qu'il est aussi simple que cela:

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

Sortie (désolé, devait supprimer « drôles » caractères de l'entrée de test)

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

(sauts de ligne et indentation sont un peu différentes dans la production originale. Je les ai changés de manière à ce qu'ils soient beaux.)

Je pense que vous n'étiez pas au courant de <xsl:sort/>, marqué <!-- key to success --> dans la feuille de style XSL. ;-)