Как использовать функцию из одного xsl в другом

У меня есть два файла xsl:" one.xsl "и" two.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')"/>

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

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

6
задан Mads Hansen 22 August 2010 в 12:22
поделиться

3 ответа

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

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

7
ответ дан 9 December 2019 в 20:38
поделиться

Вы хотите выполнить или . проще (он просто перетаскивает все внутрь), а более гибок (если есть шаблоны, конфликтующие между ними, чрезмерно поездка по названию по звонку более определенная и в целом толковая).

Отредактируйте добавленную информацию:

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

4
ответ дан 9 December 2019 в 20:38
поделиться

В two.xsl:

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

См. Также описание включения в спецификации XSLT 2.0 .

1
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: