XSLT:<xsl:strip-space>不起作用

Vin*_*ini 5 xml xslt

我的应用程序中有一个servlet过滤器,它拦截所有传入的请求,并尝试从传入的XML中去除空格,并将生成的"干净"XML写入响应.我正在使用XSLT来实现这一目标.请参阅下面的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
<xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

但是,这没有按预期工作.生成的XML与原始XML相同(尽管在样式表中使用了<xsl:strip-space elements ="*"/>.

请帮助我做到这一点.

问候,
- Ashish

Pav*_*aev 17

目前尚不清楚您打算将什么作为输出,以及您xsl:strip-whitespace最初的期望.但有一点需要注意的是,它并没有剥离所有的空白,而是只删除那些在"通常"规则下被视为微不足道的空白.特别是,从XSLT 1.0规范:

除非文本节点仅包含空格字符,否则永远不会剥离文本节点.

所以,例如,这个:

<foo>
  <bar>   </bar>
</foo>
Run Code Online (Sandbox Code Playgroud)

将被剥离为:

<foo><bar/></foo>
Run Code Online (Sandbox Code Playgroud)

因为它有3只空白文本节点(之后<foo>和之前<bar>,之间<bar></bar>,之后</bar>和之前</foo>).

另请注意,因为您<xsl:output indent="yes">在样式表中,它最终将转换为:

<foo>
   <bar/>
<foo>
Run Code Online (Sandbox Code Playgroud)

在输出中.

另一方面,这个:

<foo>
   text1
   <bar>  text2  </bar>
   text3
</foo>
Run Code Online (Sandbox Code Playgroud)

根本不会被剥离,因为它包含的所有文本节点都不是纯粹的空白节点.


小智 15

使用原始问题中的xslt,<xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/></xsl:template>应该可以做到.