<xsl: variable> Вывести значение переменной XSL с помощью <xsl: value-of>
Я пытаюсь вывести строковое значение переменной литерала после его установки в зависимости от того, существует ли node или нет. Я думаю, что логика проверки состояния верна. Но он не выводит значения...
<xsl:variable name="subexists"/>
<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:choose>
<xsl:when test="joined-subclass">
<xsl:variable name="subexists" select="'true'"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="subexists" select="'false'"/>
</xsl:otherwise>
</xsl:choose>
subexists: <xsl:value-of select="$subexists" />
Я хочу, чтобы он выводил строку буква "true" из "false". Но это ничего не выводит. Пожалуйста помоги! Спасибо!
Ответы
Ответ 1
В этом случае для установки переменной не требуются условные обозначения.
Это однострочное выражение XPath:
boolean(joined-subclass)
true()
, только если существует дочерний элемент текущего node с именем joined-subclass
и false()
в противном случае.
Полная таблица стилей:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists"
select="boolean(joined-subclass)"
/>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Обратите внимание на, что использование функции XPath boolean()
в это выражение должно преобразовать a node (или его абзац) в одно из булевых значений true()
или false()
.
Ответ 2
Основная проблема заключается в том, что переменная, объявленная за пределами шаблона, является той же переменной, что и "set" внутри оператора select. Это не то, как работает XSLT, переменная не может быть переназначена. Это больше похоже на то, что вы хотите:
<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
И если вам нужна переменная, чтобы иметь глобальную область, объявите ее вне шаблона:
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="/path/to/node/joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template match="class">
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
Ответ 3
В XSLT тот же <xsl:variable>
может быть объявлен только один раз и может быть присвоен значение только на его декларация. Если одновременно объявляется несколько переменных, они фактически являются разными переменными и имеют разный объем.
Следовательно, способ достижения желаемого условного значения переменной и создания его значения выглядит следующим образом:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Когда приведенное выше преобразование применяется к следующему XML-документу:
<class>
<joined-subclass/>
</class>
получен желаемый результат:
subexists: true