Как удалить все разрывы строк? - PullRequest
14 голосов
/ 28 ноября 2008

У меня есть что-то вроде этого:

<node TEXT="   txt A   "/>
<node TEXT="

       txt X

"/>
<node>
   <html>
      <p>
        txt Y
      </p>
   </html>
</node>
<node TEXT="txt B"/>

и я хочу использовать XSLT, чтобы получить это:

txt A
txt X
txt Y
txt B

Я хочу удалить все бесполезные пробелы и переносы строк @ TEXT и CDATA. Единственный XML-ввод, который дает структуру для вывода, - это <node> -tags.

Ответы [ 2 ]

18 голосов
/ 28 ноября 2008

следующее преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
<xsl:template match="*">
  <xsl:apply-templates select="@TEXT | node()"/>
</xsl:template>

<xsl:template match="node/@TEXT | text()">
  <xsl:if test="normalize-space(.)">
    <xsl:value-of select=
     "concat(normalize-space(.), '&#xA;')"/>
  </xsl:if>

  <xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>

применительно к этому документу XML

<t>
    <node TEXT="   txt A   "/>
    <node TEXT="       txt X"/>
    <node>
        <html>
            <p>        txt Y      </p>
        </html>
    </node>
    <node TEXT="txt B"/>
</t>

дает желаемый результат:

TXT
Текст X
текст Y
TXT B

Обратите внимание на использование стандартной функции XPath normalize-space () , которая удаляет все начальные и конечные пробелы и заменяет каждую последовательность других пробелов одним пробелом.

1 голос
/ 28 ноября 2008

Вы, вероятно, хотите

 <xsl:strip-space elements="node"/>

объяснил здесь . И эта статья имеет гораздо больше деталей.

...