פתרון בעיות בזמן ריצה של מדיניות 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"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם המשתנה של המחרוזת או message שצוין ברכיב <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 שמוצגת למעלה אמורה לפעול בתהליך הבקשה. חשוב לזכור שהמשתנה 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. הסיבה לכישלון בהודעת השגיאה תספק מידע נוסף על הגורם. בטבלה הבאה מפורטת אחת מהסיבות לכך – קידומת לא חוקית – עם דוגמה להסבר.
סיבה תיאור
המטען הייעודי (Payload) של XML לא זמין המטען הייעודי (payload) של הקלט ב-XML לא מועבר או ריק.
קובץ XML לקלט בעל מבנה שגוי המטען הייעודי (payload) של הקלט בפורמט XML שגוי או לא חוקי.
תחילית לא תקינה לעומס הנתונים של קלט ה-XML יש קידומת שלא מוגדרת בקובץ ה-XSL.

סיבה: נתוני העומס של הקלט בפורמט XML לא זמינים

השגיאה הזו מתרחשת אם לא מועברת עומס העבודה של ה-XML של הקלט, או אם עומס העבודה של ה-XML שהועברו כחלק מבקשת ה-API לשרת proxy של ה-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). המשמעות של השגיאה הזו היא שהמטען הייעודי (payload) של 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"
    

    מכיוון שהמטען הייעודי (payload) של קלט ה-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. כלומר, ה-"<" חסר במטען הייעודי (payload) של ה-XML.

    "faultstring": "Evaluation of XSL XSL-Transform.xsl failed with reason: \"Unexpected char while looking for open tag ('&lt;') character\""
    
  2. בודקים את עומס העבודה של קלט ה-XML שמוענק למדיניות XSLTransform, כדי לראות אם יש לו תוכן XML תקין. אם המטען הייעודי (payload) של הקלט הוא לא 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, ואת הסיבה לכישלון. במקרה כזה, הסיבה לכישלון תצביע על כך שיש תחילית שלא טופלה במספר שורה ספציפי בתוכן הייעודי (payload) של ה-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 לדוגמה והמטען הייעודי (payload) של ה-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>
    

    קטע ה-payload של קלט ה-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>
    

    המטען הייעודי (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)\""
    

רזולוציה

חשוב לוודא שהמטען הייעודי (payload) של הקלט מסוג XML שמועבר למדיניות XSLTransform כולל את כל הפורמטים של הרכיבים המוגדרים כקידומות בקובץ ה-XSL שבו נעשה שימוש במדיניות.

כדי לתקן את קובץ ה-XML לדוגמה שמוצג למעלה, אפשר לשנות את הקובץ באופן הבא:

עדכון של נתוני ה-payload בקובץ ה-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>