Использование функций в XSLT

Я изучаю XSLT. Эти вопросы могут быть очевидны, но я действительно застрял сейчас. Кислород возвращает следующие два вида ошибок:

  1. Пространство имен не объявлено для функции ownFunction(). ("необъявленный префикс пространства имен {xs}")

  2. неизвестная системная функция index-of-string()
    Функция XSLT index-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, определяет пространство имен библиотеки функций, с которой вы связаны. Вам также необходимо скачать реализацию библиотеки функций и импортировать ее, как показано на рисунке.

Другие вопросы по тегам