Как использовать функцию из одного xsl в другом - PullRequest
6 голосов
/ 22 августа 2010

У меня есть два 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'

Ответы [ 3 ]

7 голосов
/ 22 августа 2010

Помимо правильных ответов, которые вам нужны для <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 +.

4 голосов
/ 22 августа 2010

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

Изменить для добавленной информации:

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

1 голос
/ 22 августа 2010

В two.xsl:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...