2013-06-22 6 views
0

Я пытаюсь удалить текстовые узлы без успеха из документа XML, это XSLT, я использую:XSLT удалить все текстовые узлы

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml"/> 

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

    <xsl:template match="/*/*"> 
     <xsl:element name="x"> 
      <xsl:attribute name="attr"> 
       <xsl:value-of select="name()"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="node()" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/*/*/a"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*/*/a/*"> 
     <xsl:copy-of select="node()"/> 
    </xsl:template> 

    <xsl:template match="/*/*/*"> 
     <xsl:copy-of select="node()"/> 
    </xsl:template> 

    <xsl:template match="/*/*/*[not(self::a)]" /> 
    <xsl:template match="text()" /> 

</xsl:stylesheet> 

Линия <xsl:template match="text()"> вероятно, это не работает, потому что другие линии более конкретный (я думаю), как я могу сделать, чтобы удалить ВСЕ текстовые узлы?

ответ

3

Ваш шаблон для подавления текстовых узлов подавляет все текстовые узлы, для которых ищутся соответствующие шаблоны. Но это не подавляет все текстовые узлы, потому что не все текстовые узлы обрабатываются с помощью шаблонов apply-templates. Когда вы сталкиваетесь с некоторыми узлами (теми, которые соответствуют шаблонам соответствия /*/*/a/* и /*/*/*, вы копируете все их дочерние узлы, не применяя к ним шаблоны, если некоторые из этих детей являются текстовыми узлами или другие из этих детей имеют потомки текстовых узлов , эти текстовые узлы ускользают от вашей косы. Избавьтесь от копирования вызовов, затем, и придерживайтесь копии с применением шаблонов.

+0

Большое спасибо. – MoreOver