Использование функций в XSLT - PullRequest
2 голосов
/ 04 мая 2011

Я изучаю 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 ]

3 голосов
/ 04 мая 2011

Кислород возвращает следующие два вида ошибок:

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.

1 голос
/ 04 мая 2011

Используйте

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

...