XSLT включает и документирует ('') коллизию - PullRequest
1 голос
/ 20 октября 2010

У меня есть два файла XSLT A .xslt и B .xslt, где A .xslt включает B .xslt.

A .xslt

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:my="my_namespace">

    <my:data>This is A.xslt</my:data> 

    <xsl:include href="B.xslt"/>

    <xsl:template name="my_template">
        <xsl:value-of select="$remote-data"/>
    </xsl:template>

</xsl:stylesheet>

B .xslt

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:my="my_namespace">

    <xsl:variable name="remote-data"
                   select="document('')/*/my:data" />

</xsl:stylesheet>

Конечно, когда my_template оценивается, выводится пустая строка. Это происходит потому, что B .xslt не может my: data контейнер и document('') вызов обрабатывается перед включением .

Мой вопрос: как я могу получить доступ к my: data из B .xslt (сделать document('') для обработки после включения )?

Любые идеи приветствуются!

Обновление: В реальной жизни у меня есть несколько файлов, таких как A .xslt: A1 .xslt, A2 .xslt ,. .. и в результате необходимо выполнить точно такие же вычисления с набором узлов (как в определении $remote-data), но с другими параметрами (сохраненными в my: data ).

Можно сказать, что я могу использовать именованный шаблон для этого. Но, насколько я вижу, это невозможно сделать, потому что шаблон будет возвращать RTF, который у меня есть node-set(), который обычно недоступен в синтаксических анализаторах XSLT 1.0.

Надеюсь, это прояснит мою проблему.

Ответы [ 2 ]

0 голосов
/ 20 октября 2010

Есть две возможности :

.1.Как уже рекомендовано @ Mads-Hansen, используйте:

<xsl:variable name="remote-data" 
                   select="document('A.xslt')/*/my:data" /> 

.2.Переместите определение переменной $ remote-data в A.xslt:

<xsl:variable name="remote-data"    
               select="document('')/*/my:data" />

Тогда к ней можно получить доступ с помощью кода B.xslt, поскольку глобально определенные <xsl:variable> s доступны во всех включенныхимпортированные модули таблиц стилей.

0 голосов
/ 20 октября 2010

Функция document(), вызываемая с пустым путем, будет ссылаться на исходный XML-документ XSLT, в котором «живет» кодовый блок. В данном случае это B.xslt .

Если вы хотите загрузить / ссылаться на XML из A.xslt , измените строку на:

<xsl:variable name="remote-data"
                   select="document('A.xslt')/*/my:data" />
...