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

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

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"
        }
    }
}

Причина

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

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

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

Диагноз

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

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

    <?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.

  4. Если переменная имеет одно из следующих значений:

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

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

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