2009-08-18 15 views
1

Je rencontre des problèmes pour comprendre xslt. Dans mon document source, je dois trouver le texte interne d'une balise <p> avec l'attribut class qui est égal à "deck".comprendre xslt la manipulation des éléments avec des attributs

Dans mon xml source quelque part:

<body> 
    <p class="deck">Text here</p> 
... ... cut ... ... ... 

Dans mon fichier xsl

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:TimeInc="http://www.timeinc.com/namespaces/PAMTimeInc/1.0/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:prism="http://prismstandard.org/namespaces/basic/2.1/" 
    xmlns:pam="http://prismstandard.org/namespaces/pam/2.1/" 
    xmlns:pim="http://prismstandard.org/namespaces/pim/2.1/" 
    xmlns:prl="http://prismstandard.org/namespaces/prl/2.1/"> 

    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> 
    <Description> 
    <xsl:choose> 
     <xsl:when test="//[email protected] != ''"> 
     <xsl:value-of select="//[email protected]"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:text disable-output-escaping="yes"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </Description> 
... ... cut ... ... ... 

Il est manifestement faux parce que je ne sais pas ce que je fais. Y a-t-il un exemple quelque part sur la façon de le faire ou de le comprendre plus?

Répondre

2

Je ne vois pas d'endroit pour servir de base à votre modèle. Je suppose que c'est un problème de copier-coller, cependant.

Quoi qu'il en soit, un XPath pour trouver tous les éléments p avec attribut de classe défini sur le pont est: // p [@ class = 'deck']

Vous pouvez itérer eux avec:

<xsl:for-each select="//p[@class='deck'"> 
</xsl:for-each> 
+1

merci beaucoup, le code final a fini par être: stephenbayer

2

Vous pouvez exprimer un match conditionnel à un élément basé sur une valeur d'attribut, par exemple

element[@attribute = 'hello'] 

Pour votre cas particulier:

<p class="deck">Text here</p> 

Essayez:

//p[@class = 'deck']/text() 

Qui est une expression XPath et peut être lu comme renvoyant une séquence du contenu du texte de tous les éléments p h une classe d'attributs dont la valeur est 'deck'. XSLT utilise XPath pour naviguer dans les documents XML, ce qui vaut la peine d'être lu sur XPath ainsi que sur XSLT.

+0

Je lis en ce moment W3Schools, mais je suis mal à comprendre la langue et les concepts. leur section «essayer» me permet de mieux comprendre, en apportant des changements et en voyant ce que le changement fait. Je lis aussi sur XPath. – stephenbayer

2

Hmm ... Quelque chose comme ça peut-être:

<Description> 
    <xsl:choose> 
     <xsl:when test="//p[@class='deck']"> 
      <xsl:value-of select="//p[@class='deck']" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:test> </xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
</Description> 
Questions connexes