2012-07-18 1 views
0

У меня есть следующий тестовый код ... Я пытаюсь передать набор узлов в качестве параметра. Через несколько часов я наконец смог передать его в свой шаблон.Невозможно отличить из XRTreeFrag в XNodeSet

Как передать мой набор узлов для шаблона:

<xsl:call-template name="listing"> 
    <xsl:with-param name="customData"> 
     <xsl:apply-templates select="exslt:node-set($data)"/> 
    </xsl:with-param> 
</xsl:call-template> 

Как мой шаблон получает его:

<xsl:template name="listing"> 
    <xsl:param name="customData" select="/.."/> 
    <xsl:variable name="data"> 
     <xsl:choose> 
      <xsl:when test="not($customData)"> 
       <xsl:value-of select="/data"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$customData"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <textarea><xsl:copy-of select="$data"></xsl:copy-of></textarea> 
</xsl:call-template> 

Если установить параметры с одним вкладышем, то это было бы не жаловаться ... пример:

<xsl:variable name="data" select="$customData"/> 

Но как только я пытаюсь установить его, как это, он ломает:

<xsl:variable name="data"> 
    <xsl:value-of select="$customData"/> 
</xsl:variable> 

Получение сообщение об ошибке: org.apache.xpath.objects.XRTreeFrag не может быть приведен к org.apache.xpath.objects.XNodeSet

я только смог найти другой поток датированный еще в 2000 году, расскажут об этой подобной проблеме ... Мне нужно повторно установить его обратно, используя что-то вроде набора узлов ($ customData)/*, но я пробовал это, и это было не так.

EDIT: ОК, я могу подтвердить, что успешно прошел набор узлов внутри моего шаблона. Но я все еще не могу скопировать его в свою переменную ... Он продолжал говорить, что это все еще RTF.

<xsl:template name="listing"> 
<xsl:param name="customData" as="node-set"/> 
<!--<xsl:variable name="data" select="/data"/>--> 

<xsl:variable name="data"> 
    <xsl:choose> 
     <xsl:when test="count($customData) != 0"> 
      <xsl:copy-of select="$customData"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="/data"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

    <textarea><xsl:value-of select="$customData/record[1]"/></textarea> 
    <textarea><xsl:value-of select="/data/record[1]"/></textarea> 
    <textarea><xsl:value-of select="$data/record[1]"/></textarea> 
</xsl:template> 

выше тест показывает, что я могу получить доступ к $ CustomData и оригинальному/данные без каких-либо проблем, они оба показывают запись ... но $ данных перепутались. Так это означает, что копия от $ CustomData до $ данных не работает ...

Я попытался следующие пути, ни один из них не работает:

<xsl:copy-of select="$customData"/> 
<xsl:value-of select="$customData"/> 
<xsl:apply-templates select="exslt:node-set($customData)"/> 
<xsl:apply-templates select="exslt:node-set($customData)/data"/> 

Любая идея ...?

+0

'строка ($ CustomData)' или в качестве альтернативы ' 'должен работать без проблем. –

+0

не работает ... обновил мой оригинальный пост с материалом, который я пробовал, что может быть проблемой ...? Все еще бросать org.apache.xpath.objects.XRTreeFrag нельзя отнести к org.apache.xpath.objects.XNodeSet Но я думал, что это уже набор узлов ... почему он все еще видит RTF внутри шаблона? – codenamezero

ответ

2

Получил его работу, в основном, вместо использования шаблона-образца, мне нужно передать RTF в качестве параметра в шаблон. Это единственный способ заставить меня работать.

<xsl:with-param name="data" select="exslt:node-set($customData)"/> 

Используя этот метод, я смог MODIFY данных в уровне XSL. Это действительно здорово, я в основном манипулирую данными, которые хочу, а затем я реконструирую root /, а затем передаю свой customData своей функции шаблона.

Поэтому вместо чтения данных с корня, я читаю свои собственные измененные данные (построенные внутри XSL).

+0

Можете ли вы опубликовать полное решение? – basZero

+0

Я больше не работаю в этой компании, и мне было несколько лет. Но в основном вы можете генерировать или манипулировать xml, но хотите и хранить его в переменной (например: '$ customData'), а затем, когда вы хотите передать данные обратно в другую функцию в качестве параметра, просто передайте ее с помощью' exslt : набор узлов ($ CustomData) '. – codenamezero

+0

Ну, это не работает, как вы описали. Ошибка указана только при определении переменной: ' .... и здесь идет выбор ....' – basZero

4

Это сообщение об ошибке получено от Xalan, который является процессором XSLT 1.0. Если вы используете Xalan, то вы, вероятно, используете Java, что означает, что на самом деле нет причин вообще не переходить на XSLT 2.0 в форме Saxon. Вы обнаружите, что XSLT 2.0 устраняет многие ограничения XSLT 1.0, из которых это одно из самых раздражающих.

Если есть веская причина, почему вы не можете двигаться вперед к XSLT 2.0 (и это трудно думать об одном), существует обходное решение в виде функции exslt: node-set(), которая преобразует результат (т. е. переменная, определенная с использованием дочерних инструкций) в узел документа.

+0

Мне нужно придерживаться XSLT 1.0, поскольку 2.0 еще не полностью поддерживаются ... – codenamezero

+1

Что значит «2.0 еще не полностью поддерживается»? Поддерживается кем? –

+0

Браузеры, как и у всех, используют последний браузер. – codenamezero

1

Использование EXSLT: набор узлов действительно подавить сообщение об ошибке org.apache.xpath.objects.XRTreeFrag не может быть приведен к org.apache.xpath.objects.XNodeSet

Тем не менее, набор узлов, созданный по какой-либо причине, не может использоваться в последующих выражениях XPath; по крайней мере, он не работает с Xalan 2.6.0/XSLT 1.0, который является той версией, которую многие люди вынуждены использовать по той или иной причине.

Существует простое решение: вместо того, чтобы устанавливать переменную в набор узлов, вместо этого установите вместо нее выражение XPath. Затем вы можете использовать dyn: оцените функцию EXSLT, чтобы оценить выражение XPath, удерживаемое переменной.

Ваш код будет выглядеть примерно так:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:dyn="http://exslt.org/dynamic" 
       extension-element-prefixes="dyn" 
       exclude-result-prefixes="dyn"> 

..

<xsl:variable name="data"> 
     <xsl:choose> 
      <xsl:when test="count(.) != 0"> 
       <xsl:text>.</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:text>/data</xsl:text> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <textarea> 
     <xsl:value-of select="dyn:evaluate($data)/record[1]"/> 
    </textarea>