在声明XSL变量时如何删除空格?

时间:2010-09-03 15:44:33

标签: xslt

我必须创建一个带有选择的XSL变量。如下所示:

<xsl:variable name="grid_position">
  <xsl:choose>
    <xsl:when test="count(/Element) &gt;= 1">
      inside
    </xsl:when>
    <xsl:otherwise>
      outside
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

后来在我的代码中,我做了一个xsl if:

<xsl:if test="$grid_position = 'inside'">
   {...code...}
</xsl:if>

问题是因为换行和缩进,我的变量永远不会='内'。如何从变量中删除空格?我知道当我在xsl:copy-of中使用它时,我可以使用disable-output-escaping="yes"将其删除,但它不适用于xsl:variable标记。那么如何删除那些空格和换行符?

4 个答案:

答案 0 :(得分:16)

这就是<xsl:text>的用途:

<xsl:variable name="grid_position">
  <xsl:choose>
    <xsl:when test="count(/Element) &gt;= 1">
      <xsl:text>inside</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>outside</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

它允许您同时构建代码控制空白。

实际上,您应该清楚XSL中未包含在<xsl:text>中的文本节点,以避免将来出现这些类型的错误(即代码重新格式化或稍后重新考虑)

对于简单的情况,例如样本,what Jim Garrison suggests也可以选择。


顺便说一下,测试count()元素的存在是多余的。选择它就足够了,因为空节点集的计算结果为false

<xsl:when test="/Element">

答案 1 :(得分:4)

最简单的方法是不要将空格放在那里:

<xsl:variable name="grid_position">
  <xsl:choose>
    <xsl:when test="count(/Element) &gt;= 1">inside</xsl:when>
    <xsl:otherwise>outside</xsl:otherwise>
  </xsl:choose>
</xsl:variable>

答案 2 :(得分:2)

其他答案中的策略是好的,实际上在可行的情况下比这个更好。但是有些时候你无法控制(或者更难控制)变量中的内容。在这些情况下,您可以在测试变量时剥离周围的空间:

而不是

<xsl:if test="$grid_position = 'inside'">

使用

<xsl:if test="normalize-space($grid_position) = 'inside'">

normalize-space()剥离前导和尾随空格,并将其他重复的空格折叠为单个空格。

答案 3 :(得分:1)

只需使用

<xsl:variable name="grid_position" select=
 "concat(substring('inside', 1 div boolean(/Element)),
         substring('outside', 1 div not(/Element))
        )
 "/>