<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
Другие вопросы по тегам