2010-09-03 4 views
10

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

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

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

+0

Хороший вопрос (+1). См. Мой ответ на короткое однострочное выражение XPath для вашего '' :) –

ответ

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"> 
+0

Спасибо за это решение Tomalak, он отлично работает! – Gabriel

+0

@Gabriel: Добро пожаловать.:) – Tomalak

+0

+1 для объяснения логического значения узла set – 2010-09-03 18:46:05

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

+1 простейшее исправление. – Tomalak

+0

+1 для простейшего способа – 2010-09-03 16:52:14

+2

Спасибо за ваш ответ, но я пошел с ответом Томалака, потому что я не хочу, чтобы мой код ломался, если кто-то переформатировал код xsl, чтобы добавить разрыв строки. – Gabriel

1

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

+0

+1 для выражения одной строки – 2010-09-03 16:51:28

+0

+1 для этого отличного наконечника. Я часто пропускаю тройной оператор C:// Java/JavaScript. – dolmen

2

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

Вместо

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

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

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

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

+0

+1 Это очевидный ответ, который до сих пор отсутствовал. Хранение избыточных пробелов, а затем удаление их снова не изящно, но иногда нет никакого способа обойти его, например. когда вы не имеете никакого влияния на XML. – Tomalak

Смежные вопросы