2016-06-28 1 views
0

Первоначально: ** Как применять XPath запрос к переменной XML напечатанного в качестве элемента() * **XSLT Функция Возвращаемый тип

Я хотел бы применить XPath запросов к переменной передается функции в XSLT 2.0.

саксонские возвращает эту ошибку:

Type error at char 6 in xsl:value-of/@select on line 13 column 50 of stackoverflow_test.xslt: 
    XTTE0780: Required item type of result of call to f:test is element(); supplied value has item type text() 

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

Когда я говорю, применяю запросы XPath, я имею в виду, что хочу, чтобы запрос рассматривал базовый элемент в переменной ... если угодно ... как если бы я мог написать {count (doc ("My XSLT tree/элементная переменная ")/a [1])}.

Использование Saxon HE 9.7.0.5.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="f:f"> 
    <xsl:template match="/root"> 
    <xsl:variable name="first" as="element()*"> 
     <xsl:copy-of select="(./a[1])" /> 
    </xsl:variable> 
    <html> 
     <xsl:copy-of select="f:test($first)" /> 
    </html> 
    </xsl:template> 
    <xsl:function name="f:test" as="element()*"> 
    <xsl:param name="frstElem" as="element()*" /> 
    <xsl:value-of select="count($frstElem/a)" /> 
    <!-- or any XPath expression --> 
    </xsl:function> 
</xsl:stylesheet> 

Некоторые примеры данных

<root> 
    <a> 
     <b> 
      <c>hi</c> 
     </b> 
    </a> 
    <a> 
     <b> 
      <c>hi</c> 
     </b> 
    </a> 
</root> 

Возможно, связанный с этим вопрос: How to apply xpath in xsl:param on xml passed as input to xml

+1

Так какой результат вы ожидаете? Вы передаете элемент 'a', который имеет дочерний элемент' b', результат 'count ($ frstElem/a)' должен быть 0. –

+0

Я немного изменил вопрос: спасибо за ввод. Это дает мне уверенность, что я на правильном пути, но компилятор не заботится об этом ... –

ответ

0

Если вы хотите f:test() вернуть количество a элементов в последовательности, значение $frstElem, вы можете использовать что-то вроде

<xsl:value-of select="count($frstElem/self::a)" /> 

вместо использования (неявный) child:: оси.

+0

Я немного изменил вопрос: спасибо за ввод. Это дает мне уверенность, что я на правильном пути, но компилятор не заботится об этом ... –

+0

@ P.Coltharp: ОК. В общем, если вы боретесь с сообщением об ошибке, ** отправьте сообщение об ошибке. ** Мы не можем помочь вам с тем, что мы не можем видеть. В этом случае у вас есть ошибка типа, потому что вы объявляете функцию как возвращающую тип 'element() *', но тело функции дает значение 'text()' ('xsl: value-of' с' count(), которое дает число). Вы хотите, чтобы он возвращал элементы или число? Если вы хотите, чтобы он возвращал элементы 'a', замените' xsl: value-of' на ''. – LarsH

+0

Извините, я был сильно убежден, что это мой синтаксис XPath. Урок ** s ** (множественное число) узнал, сэр, спасибо. –

1

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

+0

Я немного изменил вопрос: спасибо за ввод. Это дает мне уверенность, что я на правильном пути, но компилятор не заботится об этом ... –