XSLTransform 政策运行时错误问题排查

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

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

原因

如果 XSLTransform 政策<Source> 元素中指定的 message 或字符串变量为以下任意一项,就会出现此错误:

  • 超出范围(在执行政策的特定流中不可用)
  • 无法解析(未定义)

例如,如果应在请求流中执行 XSLTransform 政策,但将 <Source> 元素设置为响应变量,而响应流中并不存在该变量,那么就会出现此错误。

诊断

  1. 确定发生错误的 APEXTransform 政策以及不可用的变量名称。您可以在错误响应的 faultstring 元素中找到这两项。例如,在以下 faultstring 中,政策名称为 xslt,变量为 response

    faultstring": "response message is not available for XSL: xslt
    
  2. 在失败的 XSLTransform 政策 XML 中,验证在 <Source> 元素中设置的变量的名称是否与故障字符串中标识(上述第 1 步)的变量名称相匹配。例如,以下 XSLTransform 政策在 <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> 元素中使用的变量是否已定义,以及在执行 XSLTransform 政策的流中是否可用。

  4. 如果该变量:

    • 超出范围(在执行政策的特定流中不可用)
    • 无法解析(未定义)

    就会导致错误。

    例如,假设上面所示的 XSLTransform 政策应在请求流中执行。请注意,response 变量用于政策示例的 <Source> 元素中。response 变量仅在响应流中可用。

    由于请求流中不存在 response 变量,因此会收到错误代码:

    steps.xsl.XSLSourceMessageNotAvailable
    

解决方法

确保在执行政策的流中定义且存在在失败的 XSLTransform 政策的 <Source> 元素中设置的变量。

如需更正上面所示的 XSLTransform 政策示例,您可以修改 <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 政策失败/无法根据 XSL 文件中提供的转换规则转换输入 XML 文件。很多不同的原因可能会导致 XSLTransform 政策失败。错误消息中的失败原因提供了有关原因的更多信息。下表列出了此故障的其中一个原因,即前缀无效,这是举例说明。
原因 说明
输入 XML 载荷不可用 输入 XML 载荷未传递或为空。
输入 XML 格式不正确 输入 XML 载荷格式不正确或无效。
前缀无效 输入 XML 载荷的前缀未在 XSL 文件中定义。

原因:输入 XML 载荷不可用

如果未传递输入 XML 载荷,或者将 XML 载荷作为 API 请求的一部分传递到 XSLTransform 政策为空的 API 代理,则会发生此错误。

错误消息示例

{
    "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. 标识 XML Transform 政策无法评估的 XSL 文件以及失败原因。如果输入 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://your_host_alias/v1/xsltransform" -H "Content-Type: application/xml"
    

    其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换

    由于 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. 使用 curl 命令进行 API 调用,如下所示:

    curl -v "http://your_host_alias/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

    其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换

原因:输入 XML 格式不正确

作为 API 请求的一部分传递给 XSLTransform 政策的输入 XML 载荷格式不正确或无效。

错误消息示例

{
    "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. 标识 XML Transform 政策无法评估的 XSL 文件以及失败原因。如果输入 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. 检查传递给 XSLTransform 政策的输入 XML 载荷,并查看它是否具有有效的 XML 内容。如果输入载荷不是有效的 XML,则会导致错误。

    在以下请求示例中,用户发送的输入载荷(即请求正文)无效。

    例如:

    curl -v "http://your_host_alias/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

    其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换

    在此示例中,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. 使用 curl 命令进行 API 调用,如下所示:

    curl -v "http://your_host_alias/v1/xsltransform" -H "Content-Type: application/xml" -X POST -d @city.xml
    

    其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换

原因:前缀无效

传递给 XSLTransform 政策的输入 XML 载荷中的某个元素未定义为在政策中指定的 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. 标识 XML Transform 政策无法评估的 XSL 文件以及失败原因。在这种情况下,失败原因指明输入 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 载荷。如果输入 XML 载荷的行号(在上述第 1 步中标识)中使用的前缀在 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)\""
    

解决方法

确保传递给 XSLTransform 政策的输入 XML 载荷已将所有元素格式定义为政策中使用的 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>