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

原因

このエラーは、XSL 変換ポリシーの <Source> 要素で指定された message または文字列変数が、次のいずれかである場合に発生します。

  • 範囲外(ポリシーが実行されている特定のフローで使用できない)
  • 解決できない(定義されていない)

たとえば、XSL 変換ポリシーがリクエスト フローで実行されなければならないにもかかわらず、このリクエスト フローに存在しない response 変数に <Source> 要素が設定されている場合に、このエラーが発生します。

診断

  1. エラーが発生した XSL Transformation ポリシーと、使用できない変数の名前を特定します。どちらの項目もエラー レスポンスの faultstring 要素にあります。たとえば、次の faultstring では、xslt がポリシー名、response が変数です。

    faultstring": "response message is not available for XSL: xslt
    
  2. エラーが発生した XSL 変換ポリシーの XML で、<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 変換ポリシーが実行されるフローで定義され、使用できるかどうかを確認します。

  4. 変数が次のいずれかの状態になっていないか確認します。

    • 範囲外(ポリシーが実行されている特定のフローで使用できない)
    • 解決できない(定義されていない)

    該当する場合は、それがエラーの原因です。

    たとえば、上記の XSL 変換ポリシーがリクエスト フローで実行されるとします。前述のとおり、response 変数は、サンプル ポリシーの <Source> 要素で使用されています。response 変数はレスポンス フローでのみ使用できます。

    response 変数はリクエスト フローに存在しないため、次のエラーコードを受け取ります。

    steps.xsl.XSLSourceMessageNotAvailable
    

解決策

エラーが発生した XSL 変換ポリシーの <Source> 要素内に設定された変数は、定義済みで、ポリシーが実行されるフローに存在することを確認します。

上記の XSL 変換ポリシーの例を修正するには、request 変数がリクエスト フローに存在するので、それを使用するように <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>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 ペイロードが渡されなかった場合、または XSLTransform ポリシーを持つ API プロキシに API リクエストの一部として渡された XML ペイロードが空の場合に発生します。

エラー メッセージの例

{
    "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://<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. 次の cURL コマンドを使用して API を呼び出します。

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

原因: 入力 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://<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. 次の cURL コマンドを使用して API を呼び出します。

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

原因: 無効な接頭辞

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. 上のステップ 1 で特定した XSL ファイルの内容と入力 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>