2013-09-30 8 views
0

Я пытаюсь написать функцию EXSLT, но по какой-то причине она, похоже, не возвращает результат. Функция должна искать узел в другом документе:Функция EXSLT (в lxml) не возвращает результат

<func:function name="toc:element"> 
    <xsl:param name="id" /> 
    <xsl:for-each select="$toc"> 
    <func:result select="key('id', $id)" /> 
    </xsl:for-each> 
</func:function> 

С xsl:message я могу видеть, что он действительно получает действительный $id и key() возвращает один узел; но когда я вызываю его из другого шаблона, он, похоже, не дает результата.

Окружающая среда: libxml2/libxslt, не уверены, как проверить версию; Я использую их от lxml v3.2.3.

ответ

0

Нашли решение: если я добавлю промежуточную переменную, все будет работать.

<func:function name="toc:element"> 
    <xsl:param name="id" /> 
    <xsl:for-each select="$toc"> 
    <xsl:variable name="result" select="key('id', $id)" /> 
    <func:result select="$result" /> 
    </xsl:for-each> 
</func:function> 

По-видимому, результат функции использует исходный контекст для оценки.

+0

Поскольку это выглядит скорее как ошибка, для будущих читателей было бы полезно документировать, какой XSLT-процессор вы используете. Фактически, когда вы используете расширения, подобные этому, это важно. –

+0

@MichaelKay Добавлена ​​заметка об окружающей среде; это 'libxslt', я использую его из Python через' lxml' 3.2.3. –

+0

Я ничего не знаю о реализации функции func: libxslt, но теперь у нас есть эта информация, кто-то может помочь. –