2010-10-20 2 views
1

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

.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> 

Б .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: данные контейнер и document('') звонок обрабатывается до этого включают.

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

Любые идеи оцениваются!

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

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

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

+0

Хороший вопрос, +1. См. Мой ответ на два возможных решения. –

ответ

0

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

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

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

+1 Хороший ответ. Логикой этого поведения 'fn: document() является то, что пустой строковый аргумент разрешен как URI ** таблицы стилей **, URI для' A.xslt' должен отличаться от 'B.xslt'. – 2010-10-20 13:27:17

+0

Спасибо за ответ, см. Мое обновление. –

+0

@Savva: обновление не имеет ничего общего с решением, которое я предлагаю, - достаточно, чтобы данные были определены в единой глобальной переменной . Затем эта переменная доступна во всех включенных/импортированных таблицах стилей. Нет необходимости в каких-либо функциях расширения. –

0

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

0,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

Благодарим вас за ответ, пожалуйста, ознакомьтесь с моим обновлением. –

Смежные вопросы