Как я могу удалить пробелы при объявлении переменной XSL? - PullRequest
10 голосов
/ 03 сентября 2010

Я должен создать переменную 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, если:

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

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

Ответы [ 4 ]

16 голосов
/ 03 сентября 2010

Вот для чего <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() является излишним.Достаточно выбрать его, так как пустой набор узлов оценивается как false.

<xsl:when test="/Element">
4 голосов
/ 03 сентября 2010

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

<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 голосов
/ 05 сентября 2010

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

Вместо

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

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

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

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

1 голос
/ 03 сентября 2010

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

<xsl:variable name="grid_position" select=
 "concat(substring('inside', 1 div boolean(/Element)),
         substring('outside', 1 div not(/Element))
        )
 "/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...