2010-08-22 1 views
6

У меня есть два XSL файлы: "one.xsl" и "two.xsl"Как использовать функцию из одного в другой XSL

one.xsl:

<xsl:function name="x:trans" as="xs:string"> 
    <xsl:param name="str"></xsl:param> 
    <xsl:variable name="res1" select="x:translate_string($str)"/> 
    <xsl:sequence select="$res1"/> 
</xsl:function> 
</xsl:stylesheet> 

Я хочу использовать функция «x: trans» в «one.xsl»

Как ссылаться на функцию на другой файл?


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

< xsl:value-of select="x:trans('Hello World')"/> 

Я получаю следующее сообщение об ошибке с помощью браузера:

Ссылки на необъявленный префикс пространства имен: «х '

+0

Если вы импортировали или включили «one.xsl», вам также необходимо объявить пространство имен «x» в «two.xsl», если вы хотите его использовать. –

+3

Кроме того, вы отмечаете, что сообщение из функций * browser * ... custom ** является функцией XSLT 2.0 **. В настоящее время браузеры не поддерживают XSLT 2.0. Если вы хотите, чтобы браузеры выполняли XSLT, вам понадобится решение * XSLT 1.0 *. –

+0

Хороший вопрос (+1). См. Мой ответ для полного, пошагового объяснения, как вызвать функцию «xsl: function». –

ответ

4

Вы хотите либо сделать <xsl:include />, либо <xsl:import />. <xsl:include /> проще (он просто перетаскивает все), в то время как <xsl:import /> более гибкий (при наличии шаблонов, сталкивающихся между ними, более высокая скорость вызова вызываемого вызова лучше определяется и в целом разумна).

Edit для дополнительной информации:

Вы должны убедиться, что вы называете шаблоны в импортированной таблице стилей с использованием имен соответствии с характеристиками имеющихся. Самый простой способ - убедиться, что у вас есть сопоставление xmlns: foo в таблицах стилей, хотя вы можете вызвать foo: template в одной таблице стилей в качестве шаблона bar: в другом, если вместо этого был xmlns: bar.

+0

+1 Обычно я предпочитаю импорт из include, так как он обеспечивает большую гибкость. –

+0

+1 и то же самое для предпочтения xsl: import –

+0

Yup! Импорт полностью – 2010-08-23 02:12:39

7

Помимо правильных ответов, которые вы должны <xsl:include> или <xsl:import> (я бы рекомендовал последний, как бывший часто может привести к ошибкам дублирования), ваша вторая проблема заключается в следующем:

  1. Имя функции должно принадлежать пространству имен.

  2. Пространство имен должно быть объявлено (определено и привязано к префиксу) в том же файле, в котором определена функция.

  3. Любой вызов функции имеет префикс имени функции и этот префикс должен быть привязан к тому же пространству имен, к которому имя функции принадлежит

Вот простой пример:

I.Файл deleteA.xsl определяет функцию my:double

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my" 
    > 
<xsl:function name="my:double" as="xs:double"> 
    <xsl:param name="pArg" as="xs:double"/> 

    <xsl:sequence select="2*$pArg"/> 
</xsl:function> 
</xsl:stylesheet> 

II. Файл deleteB.xsl импорта файл deleteA.xsl и использует функцию my:double:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:my="my:my"> 
    <xsl:import href="deleteA.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:sequence select="my:double(.)"/> 
    </xsl:template> 
</xsl:stylesheet> 

III. Преобразования, содержащиеся в deleteB.xsl применяются на следующем документе XML:

<t>1</t> 

и правильный результате получается:

2 

Дополнительный комментарий: В настоящее время ни один браузер не поддерживает XSLT 2.0 преобразований - xsl:function доступен только в XSLT 2.0 +.

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