Как создать переменные в XSLT, которые не являются фрагментами документа?

Рассмотрим следующий шаблон XSLT 2.0.

<xsl:template match="/">
    <xsl:variable name="var1">
        <elem>1</elem>
        <elem>2</elem>
        <elem>3</elem>
    </xsl:variable>
    <xsl:text>var1 has </xsl:text>
    <xsl:value-of select="count($var1)"/>
    <xsl:text>elements.
    </xsl:text>

    <xsl:variable name="var2" select="$var1/elem[position() &gt; 1]"/>
    <xsl:text>var2 has </xsl:text>
    <xsl:value-of select="count($var2)"/>
    <xsl:text>elements.
    </xsl:text>
</xsl:template>

Вывод этого шаблона

var1 has 1 elements
var2 has 2 elements

Первая строка выводит 1 (а не 3, как я сначала ожидал), потому что var1 — это фрагмент документа, который содержит элементы <elem> в качестве дочерних. Теперь по моим вопросам:

Как мне создать переменную, которая не содержит фрагмента документа? Я мог бы сделать это так же, как и с var2, только опустив предикат. Но, возможно, есть способ без использования второй переменной. Или, как вариант: Как сохранить фрагмент документа в переменной, отфильтровав некоторые элементы?

Исходная информация: я буду использовать содержимое переменной в рекурсивной функции, которая проверяет первый элемент в var1 по определенным критериям. Если критерии соблюдены или список элементов пуст, возвращается значение. В противном случае он вызовет себя с удаленным первым элементом var1 (как я делаю в var2). При использовании var1 в качестве параметра, содержащего фрагмент документа, выражения XPath в моем шаблоне не будут совпадать.


person chiborg    schedule 08.06.2010    source источник
comment
Хороший вопрос (+1). Смотрите мой ответ для решения.   -  person Dimitre Novatchev    schedule 08.06.2010


Ответы (1)


Как создать переменную, не содержащую фрагмент документа?

Использование:

<xsl:variable name="var1" as="element()*"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

Как сохранить фрагмент документа в переменной при фильтрации некоторых элементов?

Если у вас есть:

<xsl:variable name="var1"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

Использование:

  <xsl:variable name="var2">
    <xsl:copy-of select="$var1/*[. mod 2 = 1]"/>
  </xsl:variable> 
person Dimitre Novatchev    schedule 08.06.2010