2009-02-11 7 views
1

J'essaie de comprendre comment préserver les espaces entre les noeuds que je trie. Voici un exemple.Préserver les espaces entre xsl: noeuds sort'd

Entrée:

<a> 
    <b> 
     <c> 
      <d>world</d> 
     </c> 
     <c> 
      <d>hello</d> 
     </c> 
    </b> 
    <e>some other stuff</e> 
</a> 

sortie souhaitée:

<a> 
    <b> 
     <c> 
      <d>hello</d> 
     </c> 
     <c> 
      <d>world</d> 
     </c> 
    </b> 
    <e>some other stuff</e> 
</a> 

Voici mon xslt:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="a/b"> 
     <xsl:copy> 
      <xsl:apply-templates select="c"> 
       <xsl:sort select="d"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Et quand je le lance à travers xsltproc, je reçois ceci:

<a> 
    <b><c> 
      <d>hello</d> 
     </c><c> 
      <d>world</d> 
     </c></b> 
    <e>some other stuff</e> 
</a> 

Je préfère ne pas le faire passer par la suite après. Des idées?

Répondre

3

Vous allez vouloir ajouter ces deux lignes en haut de votre feuille de style:

<xsl:strip-space elements="*"/> 
<xsl:output indent="yes"/> 

La première ligne des bandes tous les espaces du document et le deuxième tirets de la sortie.

1

Votre deuxième modèle correspond à tous les modèles b, mais s'applique uniquement aux éléments c. Les nœuds de texte contenus sont ignorés. C'est pourquoi vous ne voyez pas d'espace entre les éléments b et c dans la sortie.

Vous devrez reformater l'arborescence, car les nœuds de texte ne sembleront pas jolis après le réordonnancement (même si vous parvenez à les inclure). La solution d'Andrews le fera.

Questions connexes