XSLT中xsl:text输出格式异常问题咨询
解决XSLT模板输出的空白(缩进/换行)异常问题
你遇到的这个问题本质上是XSLT的默认空白节点处理规则在搞鬼,我来帮你拆解原因和解决办法:
问题根源:XSLT中的空白节点保留
XSLT默认会保留样式表中除了<xsl:text>内部之外的所有空白(包括空格、换行、制表符)。我们来看你的两种写法:
第一种写法的问题
<xsl:template match="enum" mode="map"> <xsl:text>Test 4</xsl:text><xsl:text>
</xsl:text> <xsl:text>Test 5</xsl:text><xsl:text>
</xsl:text> </xsl:template>
你在模板标签<xsl:template>和第一个<xsl:text>之间有缩进的空格,还有换行——这些空白节点会被XSLT当成文本节点输出,所以就出现了Test4前面的4个缩进,以及Test3和Test4之间的空行。
第二种写法的问题
<xsl:template match="enum" mode="map"> Test 4<xsl:text>
</xsl:text> <xsl:text>Test 5</xsl:text><xsl:text>
</xsl:text> </xsl:template>
这里你把Test 4直接写在模板里,它前面的缩进空格被去掉了,但模板开头的换行、Test 4后面的换行这些空白节点依然会被输出,所以Test3和Test4之间多了两行空行。
解决办法:精准控制空白输出
有几种方式可以彻底解决这个问题:
1. 全局控制空白节点
在XSLT的根节点<xsl:stylesheet>里添加:
<xsl:strip-space elements="*"/>
这会告诉XSLT忽略所有元素节点中的空白节点,只保留你用<xsl:text>明确输出的空白。如果有些特定元素需要保留空白,可以用<xsl:preserve-space elements="xxx"/>单独指定。
2. 模板内部消除多余空白
把模板里的所有换行、缩进都删掉,或者把内容紧凑写在一行:
<xsl:template match="enum" mode="map"><xsl:text>Test 4
</xsl:text><xsl:text>Test 5
</xsl:text></xsl:template>
或者用注释包裹多余空白,既保持样式表可读性,又不输出无效空白:
<xsl:template match="enum" mode="map"><!-- --><xsl:text>Test 4</xsl:text><xsl:text>
</xsl:text><!-- --><xsl:text>Test 5</xsl:text><xsl:text>
</xsl-text><!-- --></xsl:template>
3. 调试小技巧
在oXygen里调试时,可以开启显示空白节点的功能(一般在XML视图的设置里),这样就能直观看到那些隐藏的空白节点,快速定位问题出在哪一行的空格/换行上。
内容的提问来源于stack exchange,提问作者Ephreal
相关产品推荐
相关产品推荐

