Подтвердить что ты не робот

XSLT: могу ли я объявить переменную глобально и позже присвоить ей значение

Что я могу сделать, чтобы этот код работал?

<xsl:choose>
  <xsl:when test='type = 6'>
    <xsl:variable name='title' select='root/info/title' />
  </xsl:when>
  <xsl:when test='type = 7'>
    <xsl:variable name='title' select='root/name' />
  </xsl:when>
  <xsl:otherwise>
    <xsl:variable name='title'>unknown</xsl:variable>
  </xsl:otherwise>
</xsl:choose>

<div class='title'>
  <xsl:value-of select='$title'/>
</div>

Это не работает, потому что когда я делаю <xsl:value-of select='$title'/>, $title выходит за рамки. Я попытался добавить строку <xsl:variable name='title'/> за пределы области видимости, но это тоже не сработает, потому что тогда, когда я вызываю <xsl:variable name='title' select='root/info/title' />, например, я уже задал эту переменную раньше. Как мне это решить?

4b9b3361

Ответ 1

Вы можете перемещать выбор внутри настройки переменной, например:

<xsl:variable name="title">
  <xsl:choose>
    <xsl:when test='type=6'>
      <xsl:value-of select="root/info/title" />
    </xsl:when>
    ...
  </xsl:choose>
</xsl:variable>

<div class='title'>
  <xsl:value-of select="$title" />
</div>

Ответ 2

<xsl:choose> 
  <xsl:when test='type = 6'> 
    <xsl:variable name='title' select='root/info/title' /> 
  </xsl:when> 
  <xsl:when test='type = 7'> 
    <xsl:variable name='title' select='root/name' /> 
  </xsl:when> 
  <xsl:otherwise> 
    <xsl:variable name='title'>unknown</xsl:variable> 
  </xsl:otherwise> 
</xsl:choose> 

<div class='title'> 
  <xsl:value-of select='$title'/> 
</div> 

Это не работает

Это FAQ:

Вы определяете несколько переменных, каждый из которых называется $title, и каждый бесполезен, поскольку он немедленно выходит из области действия.

Правильный способ в XSLT 1.0 для определения переменной на основе условий:

<xsl:variable name="vTitle">
    <xsl:choose>
      <xsl:when test='type = 6'>
        <xsl:value-of select='root/info/title' />
      </xsl:when>
      <xsl:when test='type = 7'>
        <xsl:value-of  select='root/name' />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="'unknown'"/>
      </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

Другой способ определения той же переменной: в этом конкретном случае вы хотите, чтобы переменная имела значение строки. Это можно выразить в более компактной форме:

<xsl:variable name="vTitle2" select=
"concat(root/info/title[current()/type=6],
        root/name[current()/type=7],
        substring('unknown', 1 div (type > 7 or not(type > 5)))
       )
"/>

Наконец, в XSLT 2.0 можно более удобно определить такую ​​переменную:

<xsl:variable name="vTitle3" as="xs:string" select=
 "if(type eq 6)
    then root/info/title
    else if(type eq 7)
            then root/name
            else 'unknown'
 "/>

Ответ 3

Вы не можете повторно назначать переменные в XSLT (1.0). Название, вероятно, не случайно выбрано; a xsl:variable является скорее символом, чем переменной.

В вашем примере вы можете использовать следующее:

<xsl:variable name='title'>
  <xsl:choose>
    <xsl:when test='type = 6'>
      <xsl:value-of select='root/info/title' />
    </xsl:when>
    <xsl:when test='type = 7'>
      <xsl:value-of select='root/name' />
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>unknown</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

Ответ 4

Помимо стандартного ответа @carolclarinet и более компактного ответа @Dimitre, когда результат зависит от некоторого node, и вы беспокоитесь о повторном использовании и расширяемости, вы можете применять шаблоны и использовать сопоставление шаблонов, i.e:

<xsl:variable name="title"> 
    <xsl:apply-templates select="type" mode="title"/> 
</xsl:variable>

<xsl:template match="type[.=6]" mode="title"> 
    <xsl:value-of select='../root/info/title"/> 
</xsl:template> 
<xsl:template match="type[.=7]" mode="title"> 
    <xsl:value-of select='../root/name"/> 
</xsl:template> 
<xsl:template match="type" mode="title"> 
    <xsl:text>unknown</xsl:text> 
</xsl:template>

Ответ 5

Я делаю это, чтобы сохранить локальное значение в xml xsl:desult _document в папку /temp_variables_loop/loop-data-id_(position()).xml.

И в следующем цикле я читаю файлы из / temp_variables_loop.alias/loop-data-id_(position()-1).xml.

Вам нужно обмануть движок xsl, сделав псевдоним /temp_variables_loop to temp_variables_loop.alias, потому что вы не можете читать и писать в один файл в одном xsl.