Использование функций в XSLT
Я изучаю XSLT. Эти вопросы могут быть очевидны, но я действительно застрял сейчас. Кислород возвращает следующие два вида ошибок:
Пространство имен не объявлено для функции ownFunction(). ("необъявленный префикс пространства имен {xs}")
неизвестная системная функция index-of-string()
Функция XSLTindex-of-string
Я получил с этого сайта, кажется, не признается
Это упрощенная версия файла XSL:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:foo="http://www.wathever.com">
<xsl:output method="xml" />
<xsl:function name="foo:ownFunction" as="xs:string">
<xsl:param name="string" as="xs:string"/>
<xsl:choose>
<xsl:when test='contains($string,"src=")'>
<xsl:variable name="position"><xsl:value-of select="index-of-string($string,'src=')"/>+<xsl:number value="10"/></xsl:variable>
<xsl:variable name="partString"><xsl:value-of select="substring($string,$position)"/></xsl:variable>
<xsl:variable name="length"><xsl:value-of select="index-of-string($partString,'quot;')"/> - <xsl:number value="2"/></xsl:variable>
<xsl:value-of select="substring($partString,1,$length)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="hotpot-jmatch-file/data/title"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:template match="/">
<data>
<title>
<xsl:variable name="string"><xsl:value-of select="hotpot-jmatch-file/data/title"/></xsl:variable>
<xsl:value-of select="foo:ownFunction($string)"/>
</title>
</data>
</xsl:template>
</xsl:stylesheet>
2 ответа
Кислород возвращает следующие два вида ошибок:
1) Пространство имен не объявлено для функции ownFunction(). ("необъявленный префикс пространства имен {xs}")
На самом деле это проблема XML. Любая таблица стилей XSLT может быть правильно оформленным XML-документом. Среди других требований для правильности, любой используемый префикс пространства имен должен быть связан с URI пространства имен в объявлении пространства имен.
Чтобы исправить это, связать "xs"
префикс к "http://www.w3.org/2001/XMLSchema"
- это значит добавить xmlns:xs="http://www.w3.org/2001/XMLSchema"
к элементу (обычно верхний элемент является хорошим выбором для этого пространства имен.
У вас та же проблема с "foo:ownFunction"
, У вас должен быть префикс "foo"
связаны / определены и видимы, прежде чем использовать его. Просто добавь xmlns:foo="my:foo"
к верхнему элементу вашей таблицы стилей.
2) "неизвестная системная функция index-of-string()". XSLT-функция "index-of-string", которую я получил с этого сайта, похоже, не распознается: http://www.xsltfunctions.com/xsl/functx_index-of-string.html
Вы забыли либо скопировать и вставить функцию с сайта Присциллы Уолмсли, либо сохранить ее в отдельном файле (рекомендуется), а затем использовать <xsl:import>
или же <xsl:include>
импортировать / включать этот файл таблицы стилей в ваше преобразование.
Наконец, такие проблемы показывают, что вам нужно более систематическое введение XSLT. Получить хорошую книгу и прочитать ее хорошо. Вы не пожалеете. Этот ответ может быть полезен при перечислении того, что я считаю хорошими учебными ресурсами по XSLT и XPath.
Использование
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:foo="http://www.wathever.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs functx""
xmlns:functx="http://www.functx.com">
<xsl:import href="location-of-functx-library.xsl"/>
...
<xsl:value-of select="functx:index-of-string($partString,'quot;')"/>
Эти примеры определяют пространство имен схемы и связывают его с префиксом xs
, определяет пространство имен библиотеки функций, с которой вы связаны. Вам также необходимо скачать реализацию библиотеки функций и импортировать ее, как показано на рисунке.