Как определить, содержит ли узел важную информацию? - PullRequest
0 голосов
/ 01 апреля 2010

Мне нужно выяснить, как определить, содержит ли узел значительную информацию.

Следующий пример показывает, что не считается мной "важной" информацией:

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

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

Это <node> для меня " пусто ".

1 Ответ

1 голос
/ 01 апреля 2010

Вот как это сделать :

<!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: variable можно указывать все символы-пробелы, а затем просто переопределить правило идентификации с помощью этого шаблона :

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

Обновление : ОП указал в комментарии, что он на самом деле хочет видеть, является ли "узел" значимым или нет, а не "чистить узел".

Решение этого уже содержится в моем решении исходной задачи:

  <xsl:variable name="vIsSignificant" select=
     "translate(., $vwhiteSpace,'') != ''"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...