处理XSLT中的空白区域

时间:2017-12-30 18:27:00

标签: xml xslt

我有一个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>&#xa;</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>&#xa;</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

我的预期输出如下:

 - Salt    
 - Sugar

 - Eggs
 - Butter

但是当我使用saxon(或其他处理器)进行转换时,我得到了上面的输出。那么如何在XSLT中正确处理空格?

注意:我对XSLT完全不熟悉并且我知道上面发布的代码可能不好 - 所以,除了这个问题之外,我感谢任何建议,使其更优雅/更好阅读/更快/更短。

2 个答案:

答案 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>&#xa;</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>&#xa;</xsl:text>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>