2016-11-02 2 views
0

Je dois afficher le texte pour un nœud donné, tout en supprimant le texte pour le nœud enfant. J'ai essayé de gérer cela en créant un modèle vide pour le nœud enfant, mais cela n'a pas fonctionné. Comment supprimer le texte d'un noeud enfant?Comment afficher certains nœuds de texte dans XSLT mais pas les autres

Voici le XML:

<?xml version="1.0" encoding="UTF-8"?> 
<document> 
    <item name="The Item"> 
     <richtext> 
      <pardef/> 
      <par def="20"> 
       <run>This text should </run> 
       <run>be displayed. 
        <popup><popuptext>This text should not be displayed.</popuptext></popup> 
       </run> 
      </par> 
     </richtext> 
    </item> 
</document> 

Voici ma feuille de style:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output indent="yes" method="html"/> 
    <xsl:template match="/*"> 
     <html> 
      <body> 
       <table border="1"> 
         <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="item"> 
     <tr> 
      <td><xsl:value-of select="@name"/></td> 
      <td> 
       <xsl:apply-templates/> 
      </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="run"> 
     <xsl:value-of select="." separator=""/> 
    </xsl:template> 

    <xsl:template match="popuptext" /> 

</xsl:stylesheet> 

Répondre

1

Vous devriez être en mesure de changer select="."-select="text()" ...

<xsl:template match="run"> 
    <xsl:value-of select="text()"/> 
</xsl:template> 

En outre, puisque vous ne faites pas un apply-templates de run, le modèle correspondant popuptext n'est pas nécessaire.

1

Si vous souhaitez afficher uniquement le texte de l'élément run, utilisez select="text()":

<xsl:template match="run"> 
    <xsl:value-of select="text()" separator=""/> 
</xsl:template> 

Si vous utilisez select="." il sélectionne tout le contenu de l'élément run, qui comprend le contenu de ses éléments enfants .

Je ne suis pas sûr que ce soit 100% la meilleure façon de le faire, mais cela empêche le contenu de l'élément enfant de run d'être affiché dans votre cas spécifique.

Ma version complète de la feuille de style est:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output indent="yes" method="html"/> 
    <xsl:template match="/*"> 
     <html> 
      <body> 
       <table border="1"> 
         <xsl:apply-templates/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="item"> 
     <tr> 
      <td><xsl:value-of select="@name"/></td> 
      <td> 
       <xsl:apply-templates/> 
      </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="run"> 
     <xsl:value-of select="text()" separator=""/> 
    </xsl:template> 

    <xsl:template match="popuptext" /> 

</xsl:stylesheet>