2010-06-08 3 views
1

Рассмотрим следующий XSLT 2.0 шаблона:Как создать переменные в XSLT, которые не являются фрагментами документа?

<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 в моем шаблоне не совпадают.

+0

Хороший вопрос (+1). См. Мой ответ для решения. –

ответ

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> 

 Смежные вопросы

  • Нет связанных вопросов^_^