2016-11-02 4 views
0

Мне нужно отобразить текст для данного узла, подавляя текст для дочернего узла. Я попытался справиться с этим, создав пустой шаблон для дочернего узла, но он не сработал. Как подавить текст дочернего узла?Как отображать некоторые текстовые узлы в XSLT, но не другие

Вот 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> 

Вот моя таблица стилей:

<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> 

ответ

1

Вы должны быть в состоянии изменить ваш select="." к select="text()" ...

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

Кроме того, так как вы не делаете шаблоны-заявки от run, шаблон соответствует popuptext не требуется.

1

Если вы хотите, чтобы отобразить текст для run элемента, используйте select="text()":

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

Если вы используете select="." он выбирает все содержание run элемента, который включает в себя содержание его дочерних элементов ,

Я не уверен, что это лучший способ сделать это на 100%, но он предотвращает отображение содержимого дочернего элемента в run в вашем конкретном случае.

Моя полная версия таблицы стилей:

<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>