Устранение ошибок выполнения правил преобразования XSL

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

XSLSourceMessageNotAvailable

Код ошибки

steps.xsl.XSLSourceMessageNotAvailable

Тело ответа с ошибкой

{
    "fault": {
        "faultstring": "response message is not available for XSL: policy_name",
        "detail": {
            "errorcode": "steps.xsl.XSLSourceMessageNotAvailable"
        }
    }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "response message is not available for XSL: xslt",
        "detail": {
            "errorcode": "steps.xsl.XSLSourceMessageNotAvailable"
        }
    }
}

Причина

Эта ошибка возникает, если переменная message или строковая переменная, указанная в элементе <Source> правила преобразования XSL, является:

  • Вне области действия (недоступно в определенном процессе, в котором выполняется правило).
  • Не удается разрешить (не определено)

Например, эта ошибка возникает, если правило преобразования XSL должно быть выполнено в потоке запроса, но элемент <Source> задан для переменной ответа, которая не существует в потоке запроса.

диагностика;

  1. Определите правило преобразования XSL, в котором произошла ошибка, и название недоступной переменной. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующем фрагменте кода faultstring название правила – xslt, а переменная – response:

    faultstring": "response message is not available for XSL: xslt
    
  2. В XML-файле правила XSL Transform, которое не удалось выполнить, убедитесь, что название переменной, заданной в элементе <Source>, совпадает с названием переменной, указанным в строке ошибки (шаг 1 выше). Например, в следующем правиле преобразования XSL в элементе <Source> задана переменная response, которая соответствует строке ошибки:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <XSL async="false" continueOnError="false" enabled="true" name="xslt">
      <DisplayName>xslt</DisplayName>
          <Properties/>
          <ResourceURL>xsl://XSL-Transform.xsl</ResourceURL>
          <Source>response</Source>
          <Parameters ignoreUnresolvedVariables="false"/>
         <OutputVariable/>
    </XSL>
    
  3. Определите, задана ли переменная, используемая в элементе <Source>, и доступна ли она в потоке, в котором выполняется правило XSL Transform.

  4. Если переменная:

    • Недоступно в определенном процессе, в котором выполняется политика.
    • Не удается разрешить (не определено)

    то это и есть причина ошибки.

    Предположим, что правило XSL Transform, показанное выше, должно выполняться в потоке запроса. Напомним, что переменная response используется в элементе <Source> примера правила. Переменная response доступна только в цепочке ответов.

    Поскольку переменная response отсутствует в потоке запроса, вы получите код ошибки:

    steps.xsl.XSLSourceMessageNotAvailable
    

Разрешение

Убедитесь, что переменная, заданная в элементе <Source> правила "Не удалось выполнить преобразование XSL", определена и существует в потоке, в котором выполняется правило.

Чтобы исправить приведенный выше пример правила преобразования XSL, можно изменить элемент <Source>, чтобы использовать переменную request, поскольку она существует в потоке запроса:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <XSL async="false" continueOnError="false" enabled="true" name="xslt">
  <DisplayName>xslt</DisplayName>
    <Properties/>
    <ResourceURL>xsl://XSL-Transform.xsl</ResourceURL>
    <Source>request</Source>
    <Parameters ignoreUnresolvedVariables="false"/>
   <OutputVariable/>
</XSL>

XSLEvaluationFailed

Код ошибки

steps.xsl.XSLEvaluationFailed

Тело ответа с ошибкой

{
  "fault": {
      "faultstring": "Evaluation of XSL <var>XSL_file_name</var> failed with reason: \"<var>reason_for_failure</var>",
      "detail": {
          "errorcode": "steps.xsl.XSLEvaluationFailed"
      }
  }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Premature end of document while parsing at line 1(possibly  around char 0)\"",
        "detail": {
            "errorcode": "steps.xsl.XSLEvaluationFailed"
        }
    }
}

Возможные причины

Эта ошибка возникает, если:

  • Входные данные XML недоступны или имеют неверный формат.
  • Правило XSLTransform не работает или не может преобразовать входной XML-файл на основе правил преобразования, указанных в XSL-файле. Сбой в работе правила XSLTransform может быть вызван разными причинами. Причина ошибки будет указана в сообщении об ошибке. В таблице ниже приведена одна из причин сбоя – "Недействительный префикс" – и пример.
Причина Описание
Недоступна полезная нагрузка XML Входные данные XML не переданы или пусты.
Неправильный формат входного XML-файла Входные данные XML имеют неправильный формат или недействительны.
Недопустимый префикс Входные данные XML содержат префикс, не определенный в файле XSL.

Причина: входная полезная нагрузка XML недоступна

Эта ошибка возникает, если входные данные XML не переданы или если полезная нагрузка XML, переданная в рамках запроса к API прокси-серверу API с правилом XSLTransform, пуста.

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Premature end of document while parsing at line 1(possibly  around char 0)\"",
        "detail": {
            "errorcode": "steps.xsl.XSLEvaluationFailed"
        }
    }
}

диагностика;

  1. Определите XSL-файл, который не удалось обработать с помощью правила XML Transform, и причину ошибки. Если входная полезная нагрузка XML не передана или пуста, в причине сбоя будет указано, что при анализе документа произошел преждевременный конец документа. Всю эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующем коде faultstring файл XSL – XSL-Transform.xsl, а причина ошибки – Premature end of document while parsing at line 1 (possibly around char 0). Эта ошибка означает, что полезная нагрузка XML не передается или пуста.

        "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Premature end of document while parsing at line 1(possibly  around char 0)\""
    
  2. Определите, пуста ли входная XML-полезная нагрузка, переданная в составе запроса. Если входные данные не переданы или пусты, это и будет причиной ошибки.

    В примере запроса ниже полезная нагрузка запроса (то есть тело запроса), отправленного пользователем, пуста.

    Пример:

    curl -v "http://<org>-<env>.apigee.net/v1/xsltransform" -H "Content-Type: application/xml"
    

    Поскольку полезная нагрузка XML пуста, вы получите ошибку:

    "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Premature end of document while parsing at line 1(possibly  around char 0)\""
    

Разрешение

Убедитесь, что входные данные, переданные правилу XSLTransform, представляют собой действительную полезную нагрузку XML и не являются пустыми.

Чтобы устранить проблему с правилом XSLTransform, передайте действительную полезную нагрузку XML. Пример:

  1. Создайте файл с названием city.xml со следующим содержимым:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    </root>
    
  2. Выполните вызов API с помощью команды cURL, как показано ниже:

    curl -v "http://<org>-<env>.apigee.net/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

Причина: неверный формат входного XML-файла

Входные данные XML, переданные как часть запроса API к правилу XSLTransform, имеют неправильный формат или недействительны.

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unexpected char while looking for open tag ('&lt;') character\"",
        "detail": {
            "errorcode": "steps.xsl.XSLEvaluationFailed"
        }
    }
}

диагностика;

  1. Определите XSL-файл, который не удалось обработать с помощью правила преобразования XML, и причину ошибки. Если входные данные XML повреждены, в причине ошибки будет указано, что обнаружен недопустимый символ. Всю эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующем коде faultstring файл XSL – XSL-Transform.xsl, а причина ошибки – Unexpected char while looking for open tag ('&lt;') character. То есть в полезной нагрузке XML отсутствует элемент "<".

    "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unexpected char while looking for open tag ('&lt;') character\""
    
  2. Проверьте входные данные XML, переданные в правило XSLTransform, и убедитесь, что они содержат действительный XML-контент. Если входные данные не являются допустимым XML-кодом, это и будет причиной ошибки.

    В примере запроса ниже входные данные (то есть тело запроса), отправленные пользователем, недействительны.

    Пример:

    curl -v "http://<org>-<env>.apigee.net/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

    Где находится city.xml:

    {
       "City": "Bengaluru",
       "Name": "Apigee",
       "Pincode": "560016"
    }
    

    Поскольку входная полезная нагрузка представляет собой JSON, а не действительный XML-код, вы получаете ошибку:

    "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unexpected char while looking for open tag ('&lt;') character\""
    

Разрешение

Убедитесь, что входные данные, переданные в правило XSLTransform, представляют собой действительную полезную нагрузку XML и не являются пустыми.

Чтобы устранить проблему с правилом XSLTransform, передайте действительную полезную нагрузку XML. Пример:

  1. Измените файл city.xml, чтобы его содержимое было представлено в формате XML, как показано ниже:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    </root>
    
  2. Выполните вызов API с помощью команды cURL, как показано ниже:

    curl -v "http://<org>-<env>.apigee.net/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

Причина: недопустимый префикс

Входная полезная нагрузка XML, переданная правилу XSLTransform, содержит элемент, который не определен как префикс в XSL-файле, указанном в правиле.

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unresolved Prefix at line 1(possibly  around char 270)\"",
        "detail": {
            "errorcode": "steps.xsl.XSLEvaluationFailed"
        }
    }
}

диагностика;

  1. Определите XSL-файл, который не удалось обработать с помощью правила преобразования XML, и причину ошибки. В этом случае причина ошибки будет указывать на неразрешенный префикс в определенной строке входных данных XML. Вся эта информация содержится в элементе faultstring ответа об ошибке. Например, в следующем коде faultstring файл XSL – XSL-Transform.xsl, причина ошибки – Unresolved Prefix, а номер строки – 1.

    "faultstring":"Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unresolved Prefix at line 1(possibly  around char 270)\""
    
  2. Проверьте содержимое файла XSL (определенного на шаге 1) и входные данные XML. Если префикс, используемый в номере строки (определенном на шаге 1 выше) входной полезной нагрузки XML, отсутствует в файле XSL, то это и является причиной ошибки.

    Ниже приведены примеры XSL и соответствующей полезной нагрузки XML, которые приводят к ошибке:

    XSL-Transform.xsl
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="text"/>
      <xsl:variable name="newline">
       <xsl:text>
       </xsl:text>
      </xsl:variable>
      <xsl:template match="/">
      <xsl:text>&lt;Life&gt;</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>Here are the odd-numbered items from the list:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="list/listitem">
          <xsl:if test="(position() mod 2) = 1">
            <xsl:number format="1. "/>
            <xsl:value-of select="."/>
            <xsl:value-of select="$newline"/>
          </xsl:if>
        </xsl:for-each>
      <xsl:text>&lt;/Life&gt;</xsl:text>
    </xsl:template>
    </xsl:stylesheet>
    

    Входные данные XML

    <?xml version="1.0"?>
    <Life:Books>
      <title>A few of my favorite albums</title>
      <listitem>Beat Crazy</listitem>
      <listitem>Here Come the Warm Jets</listitem>
      <listitem>Kind of Blue</listitem>
      <listitem>London Calling</listitem>
    </Life:Books>
    

    В примере полезной нагрузки XML, приведенном выше, есть элемент <Life:Books>. Обратите внимание, что в XSL этого префикса нет. Вместо этого у него префикс <xsl:text>&lt;Life&gt;</xsl:text>. Поэтому возникает ошибка:

    "faultstring":"Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unresolved Prefix at line 1(possibly  around char 270)\""
    

Разрешение

Убедитесь, что полезная нагрузка XML, переданная в правило XSLTransform, содержит все форматы элементов, определенные как префиксы в XSL-файле, используемом в правиле.

Чтобы исправить приведенный выше пример XML-файла, измените его следующим образом:

Обновленная полезная нагрузка XML

<?xml version="1.0"?>
<Life>
  <title>A few of my favorite albums</title>
  <listitem>Beat Crazy</listitem>
  <listitem>Here Come the Warm Jets</listitem>
  <listitem>Kind of Blue</listitem>
  <listitem>London Calling</listitem>
</Life>