Как узнать, сколько тегов содержит переменная xsl:? - PullRequest
2 голосов
/ 29 марта 2012

В XSLT 1.0, если у меня есть <xsl:variable>, объявленный так:

<xsl:variable name="ListeEcheances">
    <bla/><bli/>
</xsl:variable>

Как узнать, пусто ли оно?Или даже лучше: как узнать, сколько тегов в нем содержится?(Я знаю, что здесь есть 2 тега, но мой реальный код немного сложнее:))

<xsl:when test="$ListeEcheances=''"> возвращает true (он не считает теги, только текст);

<xsl:when test="count($ListeEcheances/*) > 0"> к сожалению, не компилируется.

Спасибо за вашу помощь.

Ответы [ 3 ]

5 голосов
/ 29 марта 2012

Это действительно неверно, и ваш компилятор правильно выдает ошибку.Вы можете только посчитать набор узлов, вы не можете сосчитать фрагмент дерева результатов .Что вам нужно, это преобразовать переменную в наборе узлов с помощью функции расширения.

Для Saxon 6.5 это будет exsl: node-set. Это работает с Saxon 6.5 и любым процессором, который поддерживает функцию EXSLT-set-set (большинство так и делают).РЕДАКТИРОВАТЬ: Jirka Kosek записал список расширений набора узлов на процессор , я уверен, что ваше в списке.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" xmlns:exsl="http://exslt.org/common">

    <xsl:variable name="ListeEcheances">
        <bla/><bli/>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:choose>
            <xsl:when test="count(exsl:node-set($ListeEcheances)/*) > 0">
                <xsl:text>Larger then zero!</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="utf-8"?>Larger then zero!

Примечание: если вы используете XSLT 2.0, все является набором узлов, и вы не столкнетесь с этой неловкостью XSLT 1.0, где фрагменты дерева результатов почти бесполезны.

2 голосов
/ 29 марта 2012

Если содержимое переменной объявлено в XSLT, как показано в вашем примере, вместо динамической оценки, вы можете использовать функцию document() для анализа файла XSLT (который является файлом XML) и оценки выражения XPath посчитать элементы в переменной:

count(document('')/*/xsl:variable[@name='ListeEcheances']/*)

Использование функции документа с пустым путем приведет к загрузке базового URI текущей таблицы стилей.

2 голосов
/ 29 марта 2012

Попробуйте <xsl:when test="count($ListeEcheances/*) > 0">

или подождите - может быть, вы получите что-то вроде

Expression must evaluate to a node-set. count(-->$ListeEcheances<--/*) > 0

Причина в том, что переменная является фрагментом дерева результатов, а не набором узлов. В XSLT 1.0 вам потребуется применить функцию набора узлов, доступную в пространстве имен, зависящем от процессора.
Например: <xsl:when test="count(msxsl:node-set($ListeEcheances/*)) > 0">

Если это не работает или вы не можете обнаружить пространство имен для использования, то может помочь хитрость:

<xsl:variable name="temp" select="$ListeEcheances"/>
<xsl:when test="count($temp/*) > 0">

Причина, по которой это работает, может быть найдена в stackoverflow rtf для набора узлов

...