如何检测节点是否包含重要信息?

时间:2010-04-01 08:33:27

标签: xslt

我需要了解如何检测节点是否包含重要信息。

以下示例显示了被我视为“重要”信息的内容:

<node>
    <node1>&nbsp;</node1>
    </br></br>
    &nbsp;

    <node1>
        &nbsp;
        <node2></br>&nbsp;</node2>
        </br></br>
    </node1>
    <!--
    and so on...
    -->
</node>

这个<node>对我来说是

1 个答案:

答案 0 :(得分:1)

以下是如何操作

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match=
   "text()
      [translate(normalize-space(), '&#160;','')
      = ''
      ]"/>
</xsl:stylesheet>

当此转换应用于以下XML文档时(您提供的那个文档严重格式错误 - 在很多方面都没有很好地形成!!):

<!DOCTYPE node [ <!ENTITY nbsp "&#160;"> ]>
<node>
    <node1>&nbsp;</node1>
    <br></br>
    &nbsp;

    <node1>
        &nbsp;
        <node2><br/>&nbsp;</node2>
        <br></br>
    </node1>
    <!--
    and so on...
    -->
</node>

然后生成想要的结果

<node>
   <node1/>
   <br/>
   <node1>
      <node2>
         <br/>
      </node2>
      <br/>
   </node1><!--
    and so on...
    -->
</node>

此技术可以推广

您可以在xsl:变量中包含所有whetespace字符,然后只需使用此模板覆盖标识规则

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:variable name="vwhiteSpace" select="' &#x9;&#xA;&#xD;&nbsp;'"/>

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

 <xsl:template match="text()">
   <xsl:if test="translate(., $vwhiteSpace,'') != ''">
     <xsl:copy-of select="."/>
   </xsl:if>
 </xsl:template>
</xsl:stylesheet>

您可以在$vwhiteSpace

中指定您认为是“空格”的所有其他字符

更新:OP在评论中指出他实际上想要查看“节点”是否重要 - 不是“清理节点”。

对此的解决方案已包含在我对初始问题的解决方案中:

  <xsl:variable name="vIsSignificant" select=
     "translate(., $vwhiteSpace,'') != ''"/>