2010-09-10 9 views
0

J'ai créé la feuille de style XSL suivante qui prend un paquet XML (provenant de SVN) et convertit tous les nœuds "d'entrée", qui n'incluent pas le texte "archive" , dans une liste séparée par des virgules pour mon script ANT. Un fichier XML exemple ressemble à ceci ....XSL supprimer des nœuds vides dans le même code

<?xml version="1.0"?> 
<lists> 
    <list path="https://mydomain.com/branches"> 
     <entry kind="dir"> 
     <name>James_Work</name> 
     <commit revision="2209"> 
      <author>James</author> 
      <date>2010-09-02T11:02:08.584250Z</date> 
     </commit> 
     </entry> 
    </list> 
</lists> 

... et mon XSL est ce ....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:variable name="selectionPropertyList"> 
     <xsl:for-each select="lists/list/entry[name!='archive']">svnType/<xsl:value-of select="name" /> 
     <xsl:if test="position()!=last()">,</xsl:if> 
     </xsl:for-each> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <root> 
     <svnType><xsl:copy-of select="$selectionPropertyList" /></svnType> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

Le problème que je suis frappé est quand je reçois un paquet vide arrière. Cela peut arriver par exemple si j'appelle le dossier des branches SVN qui est actuellement vide, et se termine avec une entrée vide dans ma liste ANT.

Un exemple paquet XML ressemble à ceci

<?xml version="1.0"?> 
<lists> 
    <list path="https://mydomain.com/branches"> 
    </list> 
</lists> 

Quelqu'un sait-il une manière que je pouvais faire filtrer ces paquets vides de mes annonces?

Merci, James

post-scriptum J'ai essayé les conseils donnés ici mais ça ne correspond pas vraiment à ce que j'essaie de faire ici. http://www.tek-tips.com/viewthread.cfm?qid=1088712&page=1

Mise à jour

Plus grand exemple d'entrée:

<?xml version="1.0"?> 
<lists> 
<list path="https://mydomain.com/website/branches"> 
<entry kind="dir"> 
    <name>ITNAM-752</name> 
    <commit revision="2171"> 
     <author>jcb4337</author> 
     <date>2010-08-30T15:13:21.006125Z</date> 
    </commit> 
</entry> 
<entry kind="dir"> 
    <name>JCB4337-577</name> 
    <commit revision="2171"> 
     <author>jcb4337</author> 
     <date>2010-08-30T15:13:21.006125Z</date> 
    </commit> 
</entry> 
<entry kind="dir"> 
    <name>JCB4337-726</name> 
    <commit revision="2209"> 
     <author>jcb4337</author> 
     <date>2010-09-02T11:02:08.584250Z</date> 
     </commit> 
    </entry> 
    <entry kind="dir"> 
     <name>JCB4337-808</name> 
     <commit revision="2206"> 
      <author>jcb4337</author> 
      <date>2010-09-01T13:01:51.693625Z</date> 
     </commit> 
    </entry> 
    <entry kind="dir"> 
     <name>JCB4337-847</name> 
     <commit revision="2172"> 
      <author>jcb4337</author> 
      <date>2010-08-30T15:14:12.803000Z</date> 
     </commit> 
    </entry> 
</list> 
</lists> 

La sortie je besoin de revenir de la XSL est le long des lignes de ce:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<branches>branches/ITNAM-752,branches/JCB4337-577,branches/JCB4337-726,branches/JCB4337-808,branches/JCB4337-847</branches> 
</root> 

J'ai utilisé le code de @ Alejandro ci-dessus et je suis à peu près là, je pense. Mais je reçois des résultats étranges en cours de route. Exemple de sortie est:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <branches> 

      branches/ITNAM-752, 
      branches/JCB4337-577, 
      branches/JCB4337-726, 
      branches/JCB4337-808, 
      branches/JCB4337-847, 

     </branches> 
     </root> 

Alors ...

1) Obtenir beaucoup d'espace blanc entre les éléments de la liste.

2) J'ai encore une virgule supplémentaire à la fin des résultats.

3) Lorsque j'essaie de l'appliquer à notre dossier de balises SVN, je reçois des résultats étranges. Les tags sont légèrement différents car ils contiennent ce dossier "archive" que je veux exclure des résultats.

Actuellement quand je sortie le dossier tags en utilisant le même code que je reçois ce ...

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
    <tags> 


     archive 

     jcb4337 
     2010-08-31T08:56:51.006125Z 


     tags/milestone 1-0-0, 
     tags/milestone 1-0-0b, 
     tags/milestone 1-0-1, 
     tags/milestone 1-0-10, 
     tags/milestone 1-0-11, 
     tags/milestone 1-0-2, 
     tags/milestone 1-0-3, 
     tags/milestone 1-0-4, 
     tags/milestone 1-0-5, 
     tags/milestone 1-0-6, 
     tags/milestone 1-0-7, 
     tags/milestone 1-0-8, 
     tags/milestone 1-0-9, 

     </tags> 
    </root> 

donc beaucoup d'espaces et archives, ainsi que tout l'horodatage, informations sur l'auteur apparaît, en utilisant @Alejandro solution .

BTW, au cas où vous vous demandez si ANT fait un remplacement de jeton directement après la fin du XSL. Il remplace l'expression svnType dans le XML. Je ne pouvais pas penser à un moyen d'appliquer le préfixe branches/tags sur chaque nœud en utilisant XSL.

J'espère que tout cela aide un peu plus et merci encore une fois pour les efforts de tous. XSL est un peu un art noir pour moi en ce moment :-).

+0

Si ces réponses ne couvrent pas votre problème, vous pourriez modifier votre question avec les questions en suspens . –

+0

Merci Alejandro. J'ai donné plus d'informations ci-dessous basé sur l'une des solutions. –

+0

Consultez ma mise à jour. N'oubliez pas de poster un commentaire dans ma réponse la prochaine fois. Sinon, je ne reçois pas de notifications. –

Répondre

0

Changer votre expression de correspondance à:

<xsl:template match="/lists[list/entry[name != 'archive']]"> 

devrait fonctionner.

(Je voudrais aussi utiliser apply-templates au lieu du selectionPropertyList $, mais cela est une autre question)

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" /> 

<xsl:template match="list"> 
    <xsl:text>svnType/</xsl:text><xsl:value-of select="entry/name" /> 
    <xsl:if test="position()!=last()">,</xsl:if> 
</xsl:template> 

<xsl:template match="/"> 
    <root> 
     <svnType> 
      <xsl:apply-templates select="//list[entry/name!='archive'][*]" /> 
     </svnType> 
    </root> 
</xsl:template> 
</xsl:stylesheet> 

essentiellement [*] dit que l'élément de liste doit avoir childNodes.

1

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="list/entry[name!='archive']"> 
     <xsl:value-of select="concat('svnType/', 
            name, 
            substring(',', 
               1, 
               position()!=last()) 
            )"/> 
    </xsl:template> 
    <xsl:template match="/"> 
     <root> 
      <svnType> 
       <xsl:choose> 
        <xsl:when test="lists/list/entry/name!='archive'"> 
         <xsl:apply-templates/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:comment>There is no entry 
            without "archive" name</xsl:comment> 
        </xsl:otherwise> 
       </xsl:choose> 
      </svnType> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<root> 
    <svnType>svnType/James_Work</svnType> 
</root> 

Avec cette entrée:

<lists> 
    <list path="https://mydomain.com/branches"></list> 
</lists> 

Sortie:

<root> 
    <svnType> 
     <!--There is no entry with "archive" name--> 
    </svnType> 
</root> 

EDIT: xsl:strip-space pour supprimer les espaces de texte uniquement des nœuds de texte de la source d'entrée.

EDIT: En outre, une approche de style de traction:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="entry[name!='archive']"> 
     <xsl:call-template name="output"/> 
     <xsl:text>,</xsl:text> 
    </xsl:template> 
    <xsl:template match="entry[name!='archive'][last()]" 
        name="output" 
        priority="1"> 
     <xsl:value-of select="concat('svnType/',name)"/> 
    </xsl:template> 
    <xsl:template match="lists"> 
     <root> 
      <svnType> 
       <xsl:apply-templates/> 
      </svnType> 
     </root> 
    </xsl:template> 
    <xsl:template match="list[not(entry/name!='archive')]"> 
     <xsl:comment>There is no entry without "archive" name</xsl:comment> 
    </xsl:template> 
</xsl:stylesheet> 

Les deux sorties stylesheet:

<root> 
    <svnType>svnType/ITNAM-752,svnType/JCB4337-577,svnType/JCB4337-726,svnType/JCB4337-808,svnType/JCB4337-847</svnType> 
</root> 
+0

+1 pour une bonne solution. –

+0

C'est celui que j'essaie d'utiliser pour le moment. La seule chose est que je suis en train de revenir ce genre de chose au moment ... –

+0

archives jcb4337 2010- 08-31T08: 56: 10.756125Z étape 1-0-0, étape 1-0-1, 1-0-3 étape, étape 1-0-4, 1-0-5 étape, jalon 1-0-6,

Questions connexes