عیب یابی خطای زمان اجرا خط مشی XSL Transform

شما در حال مشاهده مستندات 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"
        }
    }
}

علت

این خطا زمانی رخ می‌دهد که پیام یا متغیر رشته‌ای مشخص‌شده در عنصر <Source> از سیاست تبدیل XSL یکی از موارد زیر باشد:

  • خارج از محدوده (در جریان خاصی که سیاست در آن اجرا می‌شود، در دسترس نیست)
  • قابل حل نیست (تعریف نشده است)

برای مثال، این خطا زمانی رخ می‌دهد که قرار باشد سیاست XSL Transform در جریان درخواست اجرا شود، اما عنصر <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 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 Payload در دسترس نیست بار داده XML ورودی ارسال نشده یا خالی است.
ورودی XML ناقص بار داده XML ورودی ناقص یا نامعتبر است.
پیشوند نامعتبر فایل XML ورودی دارای پیشوندی است که در فایل XSL تعریف نشده است.

علت: بار داده XML ورودی در دسترس نیست

این خطا زمانی رخ می‌دهد که بار داده XML ورودی ارسال نشود یا بار داده XML ارسال شده به عنوان بخشی از درخواست API به API Proxy که دارای سیاست 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 ورودی منتقل نشود یا خالی باشد، دلیل شکست نشان می‌دهد که در هنگام تجزیه، سند به صورت Premature end of document (پایان زودرس سند) اجرا می‌شود. می‌توانید تمام این اطلاعات را در عنصر 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 Transform قابل ارزیابی نیست و دلیل شکست را شناسایی کنید. اگر محتوای 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 Transform قابل ارزیابی نیست و دلیل شکست را شناسایی کنید. در این حالت، دلیل شکست نشان می‌دهد که یک پیشوند حل نشده در یک شماره خط خاص در محتوای 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 (که در مرحله ۱ بالا مشخص شد) و فایل XML ورودی را بررسی کنید. اگر پیشوند استفاده شده در شماره خط (که در مرحله ۱ بالا مشخص شد) فایل 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 Payload

    <?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 payload نشان داده شده در بالا شامل یک عنصر <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 Payload

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