Рассмотрим следующий 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() > 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 в моем шаблоне не совпадают.
Хороший вопрос (+1). См. Мой ответ для решения. –