עבודה עם XSL

4.2.1 מבחני צמתים
4.2.2 פרדיקטים
4.2.3 מצייני ציר
4.2.4 הפעלת עיצוב בצורה רקורסיבית
4.2.5 עיצוב בצורה פרוצדורלית

4.2.1 מבחני צמתים

בד"כ מתייחסים לשמות של אלמנטים אך לפעמים גם אחרת:

*- אלמנט כלשהו

  • ()comment - מוצא אלמנט שהוא
  • ()text - צמתי טקסט
  • ()processing-intruction - הנחיות עיבוד
  • ('processing-intruction ('target- מוצא את הנחית העיבוד עם מטרה target
  • ()node- צומת כלשהי

4.2.2 פרדיקטים

פרדיקטים מאפשרים להגדיר את התבנית בצורה מדוייקת יותר :

פרדיקטים מוקפים בסוגריים מרובעים.

-[ nodetest[1 האלמנט הראשון

-[ nodetest[position()=2 האלמנט השני

[ nodetest[position() mod 2 = 0 האלמנטים הזוגיים

[(element[not(@type אלמנט שאין לא מאפיין type

-[" computer[type="personal אלמנט computer שיש לו אלמנטים בנים

type עם תוכן personal

(" computer(normalize-space(type)="type- אותו דבר רק בלי להתחשב ברווחים לפני או אחרי

4.2.3 מצייני ציר

הם קובעים לאיזו קטגוריה כללית משוייכים הצמתים הנבדקים

- ancestor אב קדמון

אב קדמון כולל הצומת עצמו- ancestor-or-self

- attribute מאפיין של הצומת הנוכחי

- child בנים של הצומת הנוכחי

- descendant צאצאים של הצומת הנוכחי

- descendant-or-self צאצאים כולל הצומת עצמו

- following/following-sibling אלמנטים שמופיעים אחרי האלמנט הנוכחי במסמך

- preceding/preceding-sibling אלמנטים שמופיעים לפני האלמנט הנוכחי במסמך

- namespace הצמתים של מרחב השם של הצומת הנוכחי

- parent ההורה של הצומת הנוכחי
- self הצומת הנוכחי

האיור הבא ממחיש את את האמור לעיל:

תמונת העץ

דוגמאות :

ancestor::colorcolor האלמנטים שהם האבות הקדמונים של האלמנט

following-sibling:colorcolor האלמנטים שבאים אחרי האלמנט

:@color*:ancestor-or-self/

כל האלמנטים שהם אבות קדמונים של האלמנט הנוכחי ,כולל עצמו, שיש להם את המאפיין color

4.2.4 הפעלת עיצוב בצורה רקורסיבית

XSLדרך אחת להפעלת העיצוב הוא להפעיל תהליך רקורסיבי אשר מנוהל ע"י מסמך ה- . יוצרים מספר תבניות כך שישנה התאמה לכל המסמך מתחילים בשורש ויורדים בעץ עד אשר אין עוד תבניות.

דוגמה:

מסמך XML

<doc>
    <para>This is a <emphasis>test</emphasis>
      <emphasis>Nested <emphasis>emphasis</emphasis></emphasis>
    </para>
</doc>

מסמך XSL

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="doc">
      <html>
      <head><title>A Document</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
      </html>
    </xsl:template>
<xsl:template match="para">
    <p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="emphasis">
    <i><xsl:apply-templates/></i>
</xsl:template>
<xsl:template match="emphasis/emphasis">
    <b><xsl:apply-templates/></b>
</xsl:template>
</xsl:stylesheet>

HTML

<html>
<head>
<title>A Document</title>
</head>
<body>
<p>This is a <i>test</i>. <i>Nested
<b>emphasis</b></i>.</p> </body> </html>

אנו רואים שכאן ישנו את האלמנט template

אשר מתאים תבנית מסויימת

לאחר מכן ישנו אלמנט apply-templates אשר ממשיך לחפש תבניות לבנים של האלמנט בעץ בעיות ברקורסיה

ישנה בעיה שצריך להתגבר עליה . הבעיה היא מה קורה אם שתי תבניות מתאימות לאותו אלמנט.

את הבעיה פותרים כך:

ות אם קיימת תבנית במודול הנוכחי.תבניות מיובאות ממסמכים אחרים אינן נחש בנוסף תבניות בעלות עדיפות (priority)נמוך יותר אינן נחשבות

את העדיפות מגדירים ע"י מאפיין priority באלמנט template

אם בכל זאת ישנה התנגשות אזי או שמעבד התבניות יכריז על שגיאה או שיבחר בתבנית המופיעה אחרונה במסמך. זה אומר שהסדר במסמך הוא הקובע האחרון.

4.2.5 עיצוב בצורה פרוצדורלית

המודל השני הוא לבחור את פעולת העיבוד בצורה פרוצדורלית. סדרת תבניות נוצרת כך שכל תבנית בוחר ומעבד באופן ספציפי את האלמנטים הנחוצים

 

מבנה XSL
אלמנטים ב XSL