<xsl: variable> Распечатайте значение переменной XSL, используя <xsl: value-of>
Я пытаюсь вывести буквальное строковое значение переменной, после того, как оно установлено в зависимости от того, существует узел или нет. Я думаю, что логика проверки состояния верна. Но это не вывод значений...
<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". Но это ничего не выводит. Пожалуйста помоги! Спасибо!!!
3 ответа
В этом случае не требуется никаких условий для установки переменной.
Это однострочное выражение XPath:
boolean(joined-subclass)
является true()
только когда дочерний узел текущего узла с именем 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()
в этом выражении - преобразовать узел (или его отсутствие) в одно из логических значений true()
или же false()
,
Ваша основная проблема - думать, что переменная, которую вы объявили вне шаблона, - это та же переменная, которая "установлена" внутри оператора выбора. Это не то, как работает 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>
В 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