2017-10-16 3 views
2

Lorsque je place le XSLT et le XML dans des validateurs XSLT en ligne, je trouve des espaces et des sauts de ligne au début (0A20) de la sortie, j'utilise Onlinetoolz pour tester http://www.online-toolz.com/tools/xslt-transformation.php mais d'autres moteurs donnent le même résultat, pourquoi est-ce que je reçois et comment puis-je supprimer les caractères au début?XML vers CSV utilisant le saut de ligne XSLT et les espaces au début de la première valeur

sortie ci-dessous montrant des espaces au début j'attendre et ne pas vouloir d'linefeeds ou d'espaces au début

 DESKTOP-H3B7ONO,20171016T100436Z,3A80-071084 

XML

<?xml version='1.0' encoding='UTF-8' ?> 
<document> 
    <properties> 
    <basic> 
     <property id="hostName"> 
     <value>DESKTOP-H3B7ONO</value> 
     </property> 
     <property id="generationDate"> 
     <value>20171016T100436Z</value> 
     </property> 
     <property id="machineId"> 
     <value>3A80-071084</value> 
     </property> 
    </basic> 
    </properties> 
</document> 

XSLT

<?xml version="1.0" encoding="Utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="text" encoding="Utf-8" /> 
<xsl:template match="basic"> 
<xsl:value-of select="property[@id='hostName']/value"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="property[@id='generationDate']/value"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="property[@id='machineId']/value"/> 
</xsl:template> 
</xsl:stylesheet> 

Répondre

1

Vous pouvez ajouter un modèle explicite vide pour des espaces blancs seulement text() nœuds pour faire en sorte que les modèles intégrés n'émettent pas les espaces dans votre sortie.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="Utf-8"/> 

    <xsl:template match="text()[not(normalize-space())]"/> 

    <xsl:template match="basic"> 
     <xsl:value-of select="property[@id = 'hostName']/value"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="property[@id = 'generationDate']/value"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="property[@id = 'machineId']/value"/> 
    </xsl:template> 

</xsl:stylesheet> 

Ou ajouter un template match sur le nœud racine, puis seulement apply-templates pour l'élément basic, en sautant le traitement par défaut de l'autre contenu dans le document qui émettrait les espaces blancs text():

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="Utf-8"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="document/properties/basic"/> 
    </xsl:template> 

    <xsl:template match="basic"> 
     <xsl:value-of select="property[@id = 'hostName']/value"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="property[@id = 'generationDate']/value"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="property[@id = 'machineId']/value"/> 
    </xsl:template> 

</xsl:stylesheet> 
2

Le problème est que l'indentation de votre source XML est transmise par l'analyseur XSLT. Pour vous en débarrasser, ajoutez <xsl:strip-space elements="*"/> avant la déclaration de modèle.

<?xml version="1.0" encoding="Utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="text" encoding="Utf-8" /> 
<xsl:strip-space elements="*"/> 
<xsl:template match="basic"> 
<xsl:value-of select="property[@id='hostName']/value"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="property[@id='generationDate']/value"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="property[@id='machineId']/value"/> 
</xsl:template> 
</xsl:stylesheet>