我有一个xml lists.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<list>
<item>Salt</item>
<item>Sugar</item>
</list>
<list>
<item>Eggs</item>
<item>Butter</item>
</list>
</data>
和XSLT样式表transform.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="text"/>
<xsl:template match="//list/item">
<xsl:text> - </xsl:text>
<xsl:value-of select="." />
<xsl:text>
</xsl:text><!--put a line-break between two list points--->
<xsl:if test="position() = last()"><!--put another line-break at the end of a list-->
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
我的预期输出如下:
- Salt
- Sugar
- Eggs
- Butter
但是当我使用saxon(或其他处理器)进行转换时,我得到了上面的输出。那么如何在XSLT中正确处理空格?
注意:我对XSLT完全不熟悉并且我知道上面发布的代码可能不好 - 所以,除了这个问题之外,我感谢任何建议,使其更优雅/更好阅读/更快/更短。
答案 0 :(得分:4)
只需将<xsl:strip-space elements="*"/>
添加到样式表。
答案 1 :(得分:2)
除了使用<xsl:strip-space elements="*"/>
之外,另一种控制输出中是否包含空白text()
节点的方法是使用text()
上的空模板匹配,其值不具有任何值“有意义的”文字。
在下面的示例中,使用normalize-space()
折叠任何空格字符(空格,制表符,回车符),然后在谓词中否定该值。这种方法的优点是您可以始终自定义此模板以包含/排除某些text()
节点,而不是使其成为全局/二元决策。
此外,对于模板匹配表达式,您不需要后代//
。匹配模式只需list/item
即可匹配item
的子list
。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="text"/>
<xsl:template match="text()[not(normalize-space())]"/>
<xsl:template match="list/item">
<xsl:text> - </xsl:text>
<xsl:value-of select="." />
<xsl:text>
</xsl:text><!--put a line-break between two list points-->
<xsl:if test="not(following-sibling::item)"><!--put another line-break at the end of a list-->
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>