2010-08-26 5 views
2

Je ne connais rien à XSLT mais j'en ai besoin pour une seule fois. Cela devrait être assez simple à faire. Qu'est-ce que le XSLT doit être pour prendre l'entrée et l'affichage suivants comme indiqué ci-dessous.Besoin d'aide pour sortir des nœuds de texte à partir de XML avec XSLT

ENTRÉE:

<TestResult> 
<set-value idref="account_lockout_duration_var">900</set-value> 
<set-value idref="account_lockout_threshold_var">5</set-value> 
    <group> 
     <id>345</id> 
     <id>265</id> 
     <field>true</field> 
     <message>dont do that</message> 
    </group> 
    <group> 
     <id>333</id> 
     <field>false</field> 
    </group> 
</TestResult> 

SORTIE

345,265,true 
333,false 

Ceci est juste un extrait, il ne peut être un élément de champ par groupe, mais les éléments d'identité ne sont pas liés.

J'ai modifié l'entrée, en utilisant les réponses ci-dessous, je reçois la sortie supplémentaire (tout est sortie, quand je veux que les éléments d'identification et sur le terrain grâce

Répondre

2

je ferais quelque chose comme ceci:

XML:

<TestResult> 
    <set-value idref="account_lockout_duration_var">900</set-value> 
    <set-value idref="account_lockout_threshold_var">5</set-value> 
    <group> 
    <id>345</id> 
    <id>265</id> 
    <field>true</field> 
    <message>dont do that</message> 
    </group> 
    <group> 
    <id>333</id> 
    <field>false</field> 
    </group> 
</TestResult> 

XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/TestResult/group"> 
    <xsl:apply-templates/> 
    <xsl:if test="following-sibling::group"> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="/TestResult/group/id|field"> 
    <xsl:value-of select="."/> 
    <xsl:if test="following-sibling::id or following-sibling::field">,</xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

OUT:

345,265,true 
333,false 
+0

merci, voir mes modifications. – user318747

+0

J'ai mis à jour ma réponse pour vos modifications. –

+0

Je pense que votre règle 'xsl: template match =" node() | @ * "' n'est pas vraiment nécessaire. Voyez ma réponse pour un code plus compact. –

1

Ce serait quelque chose comme ceci:..

<?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" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="group"> 
    <xsl:apply-templates/> 
    </xsl:template> 
    <xsl:template match="id"> 
    <xsl:apply-templates/> 
    <xsl:text>;</xsl:text> 
    </xsl:template> 
    <xsl:template match="field"> 
    <xsl:apply-templates/> 
    <xsl:text> 
</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

merci, voir mes modifications. – user318747

1

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="group/*[not(self::message)]"> 
     <xsl:value-of select="concat(.,substring(',&#xA;', 
               1 + boolean(self::field), 
               1))"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

sortie:

345,265,true 
333,false 
+0

@Alejandro: Nice code compact. +1 –

Questions connexes