Как удалить пробел при объявлении переменной XSL?
Мне нужно создать переменную XSL с выбором в ней. Как показано ниже:
<xsl:variable name="grid_position">
<xsl:choose>
<xsl:when test="count(/Element) >= 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) >= 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) >= 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))
)
"/>