Я пытаюсь вывести буквальное строковое значение переменной после его установки в зависимости от того, существует узел или нет. Я считаю, что логика проверки условий верна. Но он не выводит значения ...

<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" />

Я хочу, чтобы он выводил буквальную строку либо «истина», либо «ложь». Но ничего не выводит. Пожалуйста помоги! Спасибо!!!

19
tomato 13 Апр 2009 в 04:08

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() .

22
Deiwin 3 Июл 2012 в 16:37

Ваша основная проблема заключается в том, что вы думаете, что переменная, которую вы объявили вне шаблона, является той же переменной, которая «установлена» внутри оператора 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>
7
eddiegroves 13 Апр 2009 в 07:01

В 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
6
Dimitre Novatchev 13 Апр 2009 в 06:08