我的应用程序中有一个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>应该可以做到.