Как удалить пробел при объявлении переменной XSL?

Мне нужно создать переменную 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>

Проблема в том, что моя переменная никогда не была "внутри" из-за разрывов строк и отступа. Как удалить пробелы из моей переменной? Я знаю, что могу удалить его с помощью disable-output-escaping="yes", когда я использую его в xsl: copy-of, но он не работает с тегом xsl: variable. Итак, как я могу удалить эти пробелы и разрывы строк?

Ответ 1

То, что <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>, чтобы избежать подобных ошибок в будущем (например, когда код будет повторно отформатирован или переустановлен позже).

Для простых случаев, например, в вашем примере, делая то, что предлагает Джим Гаррисон, также есть вариант.


В стороне, тестирование на существование элемента с count() является излишним. Выбирать его достаточно, так как пустой node -set имеет значение false.

<xsl:when test="/Element">

Ответ 2

Самый простой способ - не размещать там пробелы:

<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>

Ответ 3

Стратегии в других ответах хороши, на самом деле предпочтительнее этого, когда это возможно. Но бывают случаи, когда у вас нет контроля (или это сложнее контролировать), что в переменной. В этих случаях вы можете удалить окружающее пространство при тестировании переменной:

Вместо

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

использование

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

normalize-space() разделяет ведущее и конечное пробелы и сворачивает другие повторяющиеся пробелы в одиночные.

Ответ 4

Просто используйте:

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