<xsl: variable> Распечатать значение переменной XSL, используя <xsl: value-of> - PullRequest
17 голосов
/ 13 апреля 2009

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

<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 ]

20 голосов
/ 13 апреля 2009

В этом случае для установки переменной .

не требуется никаких условий.

Это однострочное выражение 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().

7 голосов
/ 13 апреля 2009

Ваша основная проблема - думать, что переменная, которую вы объявили вне шаблона, - это та же переменная, которая «установлена» внутри оператора выбора. Это не то, как работает 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>
6 голосов
/ 13 апреля 2009

В 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
...