2017-09-22 2 views
0

Je suis en train de créer un fichier vide via xslt.xslt - crée un fichier vide en utilisant xslt 1.0

L'échantillon d'entrée est:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Businessman> 
    <siblings> 
     <sibling>John </sibling> 
    </siblings> 
    <child> Pete </child> 
    <child> Ken </child> 
</Businessman> 

Lorsque l'entrée contient toute présence d'étiquettes « enfant », il devrait produire le fichier TEL QUEL. Lorsque l'entrée n'a pas de balise 'enfant', j'ai besoin d'un fichier vide (fichier de 0 octet) créé.

C'est ce que j'ai essayé:

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


<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:template match="@*|node()"> 
    <xsl:choose> 
    <xsl:when test="/Businessman/child"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:when> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

Cela donne le fichier inchangé quand il y a une balise 'enfant présente. Mais n'a pas produit de fichier vide lorsqu'il n'y a pas de balise 'enfant'.

Le fichier que je dois tester ressemblera:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Businessman> 
    <siblings> 
     <sibling>John </sibling> 
    </siblings> 
</Businessman> 

Toute aide serait génial!

Merci

Répondre

1

Si vous voulez que la processeur pour aller à la peine d'ouvrir le fichier de sortie, vous devez lui donner quelque chose à écrire dans le fichier de sortie. Essayez un noeud de texte vide. Et vous avez seulement besoin de prendre la décision 'copier ou pas?' une fois que.

Une façon de prendre la décision juste une fois et produire une sortie vide si la condition est pas remplie serait de remplacer votre modèle avec:

<xsl:template match="/"> 
    <xsl:choose> 
    <xsl:when test="/Businessman/child"> 
     <xsl:copy-of select="*"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Cela fonctionne comme prévu avec xsltproc. (Si vous trouvez un fichier contenant une déclaration XML et rien d'autre, essayez de régler les paramètres sur xsl: output.)

Mais quand je me suis trouvé dans une situation similaire (effectuer cette transformation si la condition C est vraie, sinon ...), je l'ai simplement ajouté un modèle pour le nœud de document qui ressemblerait à quelque chose comme ceci pour votre cas:

<xsl:choose> 
    <xsl:when test="/Businessman/child"> 
    <xsl:apply-templates/> 
    </ 
    <xsl:otherwise> 
    <xsl:message terminate="yes">No children in this input, dying ...</ 
    </ 
</ 

de cette façon, je reçois pas de sortie du tout plutôt que la sortie de longueur nulle.

+0

Comment ajuster la sortie xsl? J'ai essayé quelques trucs - Mais je continue à obtenir " –

+0

mettre' omit-xml-declaration' à 'oui' –

0

Assez simple - Il suffit de ne pas essayer de tout faire en un seul modèle, ne pas oublier d'omettre la déclaration xml et obtenir le droit de XPath:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Businessman[child]" priority="9"> 
     <xsl:element name="Businessman"> 
      <xsl:apply-templates /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Businessman" priority="0" /> 

    <xsl:template match="@* | node()"> 

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