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. 找出發生錯誤的 XSLTransform 政策,以及無法使用的變數名稱。您可以在錯誤回應的 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 政策為空白,就會發生此錯誤。

錯誤訊息範例

{
    "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 轉換政策無法評估的 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

傳送至 XSLTransform 政策的 API 要求中,輸入 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 轉換政策無法評估的 XSL 檔案,以及失敗的原因。如果輸入的 XML 酬載格式不正確,失敗原因會指出有不明字元。您可以在錯誤回應的 faultstring 元素中找到所有這些資訊。例如,在以下 faultstring 中,XSLT 檔案為 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 轉換政策無法評估的 XSL 檔案,以及失敗的原因。在這種情況下,失敗的原因會指出輸入 XML 酬載中特定行號有未解析的前置字串。您可以在錯誤回應的 faultstring 元素中找到所有這類資訊。例如,在以下 faultstring 中,XSLT 檔案為 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> 元素。請注意,XSLT 沒有這個前置字串。而是使用前置字串 <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>