XSL, Который Возвраты неизменное XML

Неустранимая ошибка: вызов неопределенной функции XXX

Случается, когда вы пытаетесь вызвать функцию, которая еще не определена. Общие причины включают отсутствующие расширения и включают в себя объявление условной функции, функцию в объявлении функции или простые опечатки.

Пример 1 - Декларация условной функции

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

В этом случае fn() никогда не будет объявлено, потому что $someCondition не соответствует действительности.

Пример 2 - Функция в объявлении функции

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

В этом случае fn будет объявлен только после вызова createFn(). Обратите внимание, что последующие вызовы createFn() вызовут ошибку об обновлении существующей функции.

Вы также можете увидеть это для встроенной функции PHP. Попробуйте найти функцию в официальном руководстве и проверьте, к какому «расширению» (к нему принадлежит PHP-модуль), и какие версии PHP поддерживают его.

В случае отсутствующее расширение, установите это расширение и включите его в php.ini. Обратитесь к Инструкции по установке в Руководстве по PHP для расширения вашей функции. Возможно, вы также сможете включить или установить расширение с помощью диспетчера пакетов (например, apt в Debian или Ubuntu, yum в Red Hat или CentOS ) или панель управления в среде общедоступного хостинга.

Если функция была введена в более новой версии PHP из того, что вы используете, вы можете найти ссылки на альтернативные реализации в руководстве или в разделе комментариев , Если он был удален из PHP, найдите информацию о том, почему, поскольку это может быть уже не нужно.

В случае отсутствия включено, обязательно включите файл, объявляющий функцию перед вызовом функции.

В случае опечаток исправить опечатку.

Вопросы, относящиеся

25
задан Dimitre Novatchev 17 October 2010 в 20:29
поделиться

3 ответа

Для копирования полного XML-документа необходимо иметь шаблон, который соответствует корню. Это могло бы быть:

          <xsl:template match="/">

или

          <xsl:template match="node()">

Тогда единственное копирование текущего узла (корневой узел) просто достаточно:

          <xsl:copy-of выбор ="."/>

Так, одно такое полное преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
      <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

, Хотя это является, вероятно, самым простым такое преобразование, , программисты XSLT используют другой, широко известный как identity transformation или identity rule :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

причина преобразование идентификационных данных считается одним самыми фундаментальными шаблонами разработки XSLT и так в широком масштабе использоваться, то, что путем переопределения этого шаблонного правила с другим, более определенными шаблонами, можно очень легко выполнить множество операций, которые иначе будут трудными. Примеры удаляют деталь (набор) элемент (элементы), которые имеют собственное имя или удовлетворяют некоторое другое условие, переименовывая конкретные элементы, изменяя пространство имен конкретных элементов, создавая новых детей или одноуровневые элементы конкретных элементов..., и т.д.

Для получения дополнительной информации, и фрагменты кода с помощью преобразования идентификационных данных, действительно посмотрите здесь .

35
ответ дан Dimitre Novatchev 28 November 2019 в 21:04
поделиться

Это - типичная проблема, и ответ называют , идентификационные данные преобразовывают . Следующий шаблон скопирует существующий XML правильно. Вы тогда добавляете дополнительные шаблоны для изменения поведения (например, удаляющий определенные элементы, переименовывая элементы или атрибуты, и т.д.).

<xsl:template match="@*|node()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>
10
ответ дан cletus 28 November 2019 в 21:04
поделиться

Как насчет:

<xsl:template match ="/">
  <xsl:copy-of select="."/>
</xsl:template>

, Возможно, существует еще более простой путь?

0
ответ дан krosenvold 28 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: