2015-12-08 2 views
1

У меня проблема с xsl: include и xsl: apply-templates. Я делаю некоторые эксперименты с динамическим QName в xsl: call-template, и я нашел способ, как это сделать, но ... он работает только «inline», а не во включенном файле.apply-templates не работает с включенным файлом

Если я сделаю это, она работает хорошо (один файл - file.xsl) - это показать текст "тест" из шаблона матча:

<xsl:variable name="template" select="document('')/*/xsl:template"/> 

<xsl:template match="xsl:template[@name='test']" name="test"> 
    test 
</xsl:template> 

<xsl:template match="root"> 
    <xsl:apply-templates select="$template[@name = $show]"/> 
</xsl:template> 

($ шоу = 'тест')

Но, если я поместил первую часть в другой файл, например template.xsl, а затем я буду называть его с помощью xsl: include, он НЕ работает. У меня нет идеи, почему.

<xsl:variable name="template" select="document('')/*/xsl:template"/> 

<xsl:include href="template.xsl" /> 

<xsl:template match="root"> 
    <xsl:apply-templates select="$template[@name = $show]"/> 
</xsl:template> 

Есть ли кто-нибудь, кто может мне помочь в этом, пожалуйста? XSL: включить должны поместить содержимое filename.xsl на родительский шаблон, но это выглядит, как это было не

Примечание: У меня есть XSLT 1.0

Edit 2015-12-10: Спасибо вам ребята за указание к проблеме. Я устанавливаю путь к документу ('') динамически, и он работает как шарм! Очевидно, проблема заключалась в том, что этот пустой документ (''), большое спасибо Майклу и другим.

<xsl:variable name="path"><xsl:value-of select="$show"/>.xsl</xsl:variable> 
<xsl:variable name="templatePath" select="document($path)/*/xsl:template"/> 
... 
... 
<xsl:template match="root"> 
    <xsl:apply-templates select="$template[@name = $show]"/> 
</xsl:template> 
+0

Вы хотите добавить ввод, вывод и полный xslt, который вы уже пробовали? – Rao

+0

Из xpath в вашем матче, я думаю, вы используете этот шаблон самостоятельно. То есть вы используете тот же файл, что и вход и преобразование. При преобразовании в заменен ссылочным файлом, на входе это не так. –

ответ

0

Причина, по которой он не работает в том, что выражение

document('')/*/xsl:template 

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

Образец дизайна, который вы используете, по существу представляет собой переосмысление первой версии (XSLT 1.0) FXSL Dimitre Novatchev. Я предлагаю вам прочитать об этом. IIRC, подход Dimitre не соответствует XSL: элементы шаблона, а на элементы, имена которых соответствуют именам шаблонов, которые вы хотите выполнить:

<xsl:variable name="names-fragment"> 
    <A/> 
    <B/> 
</xsl:variable> 

<xsl:variable name="names" select="exslt:node-set($names-fragment)"/> 

<xsl:template name="A" match="A"> 
    <xsl:call-template name="B"/> 
</xsl:template> 

<xsl:template name="B" match="B"> 
    <xsl:param name="target"/> 
    <xsl:apply-templates select="$names/*[name()=$target]"/> 
</xsl:template> 

Здесь переменная $names доступна во всех модулях таблиц стилей.

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

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