<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