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' />
, например, я уже задал эту переменную раньше. Как мне это решить?
Ответы
Ответ 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.