У меня есть два файла 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'
Помимо правильных ответов, которые вам понадобятся в
или
(я бы рекомендовал последнее как первое может часто приводить к ошибкам дублирования), ваша другая проблема заключается в следующем :
Имя функции должно принадлежать пространству имен .
Пространство имен должно быть объявлено (определено и связано с префиксом) в том же файле, в котором определена функция.
Любой вызов функции должен содержать префикс имени функции, и этот префикс должен быть привязан к тому же пространству имен , которому принадлежит имя функции
Вот простой пример:
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 +.
Вы хотите выполнить
или
.
проще (он просто перетаскивает все внутрь), а
более гибок (если есть шаблоны, конфликтующие между ними, чрезмерно поездка по названию по звонку более определенная и в целом толковая).
Отредактируйте добавленную информацию:
Убедитесь, что вы вызываете шаблоны в импортированной таблице стилей, используя соответствующее пространство имен. Самый простой способ - убедиться, что у вас есть соответствующие объявления xmlns: foo в таблицах стилей, хотя вы могли бы вызвать foo: template в одной таблице стилей как bar: template в другой, если бы вместо нее был xmlns: bar.