2017-10-17 5 views
1

Dans le MWE ci-dessous, j'ai une séquence d'attributs, que je trier, puis tous deux sortent le XML et l'attribut. Quand je sortie le XML entier, il semble triée:XSL Le tri ne fonctionne pas sur les attributs?

<data attr="attrA">testA</data><data attr="attrZ">testZ</data> 
<data attr="attrZ">testZ</data><data attr="attrA">testA</data> 

Cependant, si j'imprime ensuite les attributs, je ne reçois pas la sortie trié (croissant == décroissant):

attrZ attrA 
attrZ attrA 

Comment est-ce possible? Comment puis-je obtenir:

attrA attrZ 
attrZ attrA 

??

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema">  
    <xsl:variable name="dataUnsorted" as="element()*"> 
      <data attr="attrZ">testZ</data> 
      <data attr="attrA">testA</data> 
    </xsl:variable> 

    <xsl:variable name="dataAscending" as="element()*"> 
     <xsl:perform-sort select="$dataUnsorted"> 
     <xsl:sort select="@attr" order="ascending"/> 
     </xsl:perform-sort> 
    </xsl:variable> 

    <xsl:variable name="dataDescending" as="element()*"> 
     <xsl:perform-sort select="$dataUnsorted"> 
     <xsl:sort select="@attr" order="descending"/> 
     </xsl:perform-sort> 
    </xsl:variable> 

    <xsl:template match="/"> 
      <xsl:message> 
      <xsl:copy-of select="$dataAscending"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:copy-of select="$dataDescending"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:value-of select="$dataAscending/@attr"/> 
     </xsl:message> 
     <xsl:message> 
      <xsl:value-of select="$dataDescending/@attr"/> 
     </xsl:message> 
     </xsl:template>  
</xsl:stylesheet> 

Répondre

1

L'étape /@attr dans $dataAscending/@attr sélectionne les nœuds d'attribut et les trie dans l'ordre du document, qui est ainsi une étape de sélection de noeuds est défini (https://www.w3.org/TR/xpath-31/#id-path-operator).

Si vous voulez préserver l'ordre que vous avez trois options:

  1. Utilisez une expression for in return: for $e in $dataAscending return $e/@attr
  2. Trier et stocker la séquence d'attributs au lieu de la séquence d'éléments
  3. XPath/XSLT 3+ uniquement: utiliser !: [email protected]