我有这样的事情:

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

有帮助吗?

解决方案

下面的变换:

<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 - 答,点击 TXT X结果 TXTÿ结果 TXT乙

<强>请注意,使用标准的XPath函数正常化空间( ) 下,其剥去所有前导和结尾间隔并取代其它空间的每个序列只用一个空间。

其他提示

您可能希望

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

解释此处。这文章,有很多更多的细节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top