2010-11-25 25 views
4

J'ai ce (signe de) fichier XML dont je veux imprimer juste le « Imprimer cette » chaîne, en ignorant ce qui suit:Comment puis-je obtenir seulement le premier niveau, plus élevé, chaîne?

<tag1> 
    Print this 
    <tag2> 
     Do not print this 
    </tag2> 
</tag1> 

Dans mon fichier XSL, avec cette commande, je reçois la fois le contenu tag1 et le contenu de tag2 imprimés:

<xsl:value-of select="tag1"/> 

Merci!

+0

copie exacte [Sortie première chaîne, pas des chaînes pour tous les enfants] (http: // stackoverflow.com/questions/4227720/chaîne-première chaîne-pas-tous-enfants-cordes) –

+0

Bonne question, +1. Voir ma réponse pour une explication et pour une solution correcte et plus précise que celle actuellement acceptée. –

Répondre

3

Dans mon fichier XSL, avec cette commande, je obtenir à la fois le contenu de balise1 et les contenu de tag2 imprimé:

<xsl:value-of select="tag1"/> 

Comment puis-je obtenir que la première, plus niveau, chaîne?

Votre code produit la valeur de chaîne de l'élément tag1, qui par définition est la concaténation de tous les textes-nœuds-descendants de l'élément.

Produire juste

le "Imprimer cette" chaîne

vous devez spécifier une expression XPath qui sélectionne uniquement le nœud texte respectif:

/tag1/text()[1] 

La spécification [1] est nécessaire pour s élire uniquement le premier enfant de nœud de texte, sinon deux nœuds de texte peuvent être sélectionnés (il s'agit uniquement d'un problème dans XSLT 2.0 où <xsl:value-of> produit les valeurs de chaîne de tous les nœuds spécifiés dans l'attribut select).

En outre, l'expression ci-dessus sélectionne le nœud de texte entier et sa valeur de chaîne n'est pas "Print this".

La valeur de chaîne est en fait:

" 
    Print this 
    " 

et exactement ce serait sortie si vous entourez le <xsl:value-of> entre guillemets.

Pour produire exactement la chaîne désirée "Print this" utilisation:

"<xsl:value-of select="normalize-space(/tag1/text()[1])"/>" 
3

value-of d'un élément vous donnera la valeur de ses nœuds de texte et de ses descendants. Si vous voulez juste le nœud text() immédiat de l'élément, utilisez ceci:

<xsl:value-of select="tag1/text()"/> 
2

<xsl:value-of select="tag1/text()"/> sélectionnera tous les noeuds de texte sous tag1