2012-12-30 4 views
2

Ceci est ma feuille de calcul XSL:XSL: pourquoi l'indentation ne fonctionne pas?

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

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:element name="outer"> 
       <xsl:apply-templates select="elements"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="element1"> 
     <xsl:element name="output1"> 
      <xsl:element name="output1.5" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="element2"> 
     <xsl:element name="output2"/> 
    </xsl:template> 

</xsl:stylesheet> 

XML Entrée:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<elements> 
    <element1>value1</element1> 
    <element2>value2</element2> 
</elements> 

La sortie est pas en retrait selon la hiérarchie XML de sortie. Ceci est la sortie réelle (notez comment output1.5 et output1 ne sont pas correctement indentées):

<outer> 
    <output1> 
<output1.5/> 
</output1> 
    <output2/> 
</outer> 
+0

Vous devez utiliser un processeur XSLT 2.0 buggy. Avec tous les processeurs XSLT 2.0 j'ai: Saxon 9.1.05, Saxon 9.4.06EE, XQSharp (XmlPrime) et Altova 2012 Je reçois des résultats indentés –

+0

Quel processeur XSLT 2.0 utilisez-vous? Comment gérez-vous la transformation, comment sauvegardez-vous le résultat et regardez-le? –

+0

J'utilise javax.xml.transform pour exécuter la transformation, avec toutes les configs par défaut. Comment puis-je vérifier quel processeur utilise cette bibliothèque Java? – zer0stimulus

Répondre

6

Qu'est-ce que vous voyez est en fait le résultat de ne pas indenter du tout; Les deux lignes qui sont indentées résultent du traitement de l'espace blanc utilisé pour indenter le document source.

Si vous deviez ajouter <xsl:strip-space elements="*" /> à votre feuille de style, vous n'obtiendriez aucune indentation dans votre sortie.

L'indentation n'est pas réellement contrôlée par le processeur XSLT, elle est contrôlée par tout ce qui sérialise la sortie vers une chaîne, bien que cela soit généralement fait par le même appel de méthode. Je ne peux pas dire avec certitude pourquoi l'instruction xsl:output n'a pas fait le travail, mais vous pouvez ajouter à votre java:

transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

et éventuellement, si vous voulez définir combien tiret par:

transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

Je ne peux pas dire à coup sûr, mais il est le problème est tout à fait possible que le montant en retrait par n'est pas défini, et utilise 0.

+0

A travaillé pour moi en utilisant groovy. –

+1

Définition de l'indentation travaillée – DMaguireKane