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

Gab*_*iel 10 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>
Run Code Online (Sandbox Code Playgroud)

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

<xsl:if test="$grid_position = 'inside'">
   {...code...}
</xsl:if>
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*lak 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>
Run Code Online (Sandbox Code Playgroud)

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

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

对于简单的情况,例如在你的样本中,做Jim Garrison所建议的也是一种选择.


另外,测试元素的存在count()是多余的.选择它就足够了,因为空节点集的计算结果为false.

<xsl:when test="/Element">
Run Code Online (Sandbox Code Playgroud)


Jim*_*son 5

最简单的方法是不要将空格放在首位:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但是我接受Tomalak的回答,因为如果有人重新格式化xsl代码以添加换行符,我不希望我的代码中断。 (2认同)

Lar*_*rsH 5

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

代替

<xsl:if test="$grid_position = 'inside'">
Run Code Online (Sandbox Code Playgroud)

使用

<xsl:if test="normalize-space($grid_position) = 'inside'">
Run Code Online (Sandbox Code Playgroud)

normalize-space()去除前导和尾随空白,并将其他重复空白折叠为单个空白。