אלמנטים ב XSL

4.3.1 value-of
4.3.2 for-each
4.3.3 copy-of
4.3.4 attribute and attribute-set
4.3.5 variable
4.3.6 number

4.3.1 value-of

אלמנט זה יוצר צומת טקסט ומכניס אותו לעץ התוצאה.

הדוגמה הבאה מכניסה את section שהוא הבן שלpaper בתוך פיסקה

<xsl:template match="paper">
    <p>
      <xsl:value-of select="section"/>
    </p>
</xsl:template>

השורה הבאה כותבת למסמך התוצאה את האלמנט הנוכחי

 
<xsl:value-of select="."/>

 

השורה הבאה כותבת למסמך תוצאה את הערך 15 P> <xsl:value-of select="3*5"/>

השורה הבאה מדפיסה למסמך התוצאה את תוכן הבן type של האלמנט הנוכחי
<xsl:value-of select="type"/>

 

text

השורה הבאה מדפיסה למסמך התוצאה את הערך של המשתנה book
<xsl:value-of select="{$book}"/>

 

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

<xsl:template match="car">
    <p>
        <xsl:value-of select="year"/>
       <xsl:text> </xsl:text>
       <xsl:value-of select="color"/>
     </p>
</xsl:template>

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

<xsl:template match="car">
     <p>
       <xsl:value-of select="@year"/>
       <xsl:text> </xsl:text>
       <xsl:value-of select="@color"/>
     </p>
</xsl:template>

אותה דוגמה כאשר המפריד בין שני המאפיינים הוא ":"

<xsl:template match="car">
     <p>
       <xsl:value-of select="@year"/>
       <xsl:text>:</xsl:text>
       <xsl:value-of select="@color"/>
     </p>
</xsl:template>

4.3.2 for-each

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

תחביר :

<xsl:for-each select="expression">
<xsl:sort>
     template-body
</xsl:for-each>

דוגמה :

מסמך XML

<?xml version='1.0'?>
<table>
       <row><entry>a1</entry><entry>a2</entry></row>
        <row><entry>b1</entry><entry>b2</entry></row>
        <row><entry>c1</entry><entry>c2</entry></row>
</table>

כאן למשל אנו צריכים שתי לולאות ,לולאה אחת עבור מעבר על שורה בטבלה ושניה למעבר על שני הנתונים בכל שורה

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

מסמך XSL

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="table">
     <table>
          <xsl:for-each select="row">
            <tr>
              <xsl:for-each select="entry">
                <td><xsl:apply-templates/></td>
              </xsl:for-each>
            </tr>
          </xsl:for-each>
      </table>
</xsl:template>
</xsl:stylesheet>

מסמך HTML

<table>
  <tr>
    <td>a1</td><td>a2</td>
  </tr>
  <tr>
    <td>b1</td><td>b2</td>
  </tr>
  <tr>
    <td>c1</td>
    <td>c2</td>
  </tr>
</table>

ניתן לסדר את הנותנים לפי סדר עולה או יורד ע"י שימוש באלמנט

 
<xsl:sort>

 

המאפיין order קובע אם לפי סדר עולה או יורד
- עולהascending
- יורד descending

דוגמה

להלן מסמך XML עם קטלוג של תקליטורים

<CATALOG>
     <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>Columbia</COMPANY>
      <PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
    </CD>
     <CD>
      <TITLE>Hide your heart</TITLE>
      <ARTIST>Bonnie Tyler</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>CBS Records</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1988</YEAR>
    </CD>
    <CD>
      <TITLE>Greatest Hits</TITLE>
      <ARTIST>Dolly Parton</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>RCA</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1982</YEAR>
    </CD>
</CATALOG>

אנו רוצים לסדר את האמנים ותקליטיהם לפי סדר עולה של שמות האמנים

מסמך XSL

<xsl:template match="/">
   <table>
     <xsl:for-each select="CATALOG/CD">
     <xsl:sort select="ARTIST" order="ascending"/>
       <tr>
         <td><xsl:value-of select="TITLE"/></td>
         <td><xsl:value-of select="ARTIST"/></td>
       </tr>
     </xsl:for-each>
   </table>
</xsl:template>

פילטור

ניתן לבחור על פי קריטריון מסוים.

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

 
<xsl:for-each select="CATALOG/CD[ARTIST='Dolly Parton']">

 

האופרטורים האפשריים הם:
=

שווה
=!

<& שונה
קטן מ -
>&

גדול מ -

לדוגמה נניח שהוספנו אלמט שנקרא CD-SOLD ואנו רוצים רק את האמנים שמכרנו יותר מ -1000 עותקים שלהם אזי נשנה את השורה ל:

 
<xsl:for-each select="CATALOG/CD[CD-SOLD &>'1000']">

 

תנאי if

תנאי זה דומה לתנאי בשפות תכנות רבות

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

<xsl:if match=".[ARTIST='Dolly Parton]">
... some output ...
</xsl:if>

מסמך XSL

<?xml version='1.0'>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
  <xsl:template match="/">
    <html>
     <body>
       <table border="2" bgcolor="yellow">
         <tr>
         <th>Title</th>
         <th>Artist</th>
         </tr>
         <xsl:for-each select="CATALOG/CD>
        <xsl:if match=".[ARTIST='Dolly Parton']>
          <tr>
           <td><xsl:value-of select="TITLE"/></td>
           <td><xsl:value-of select="ARTIST"/></td
        </tr>
</xsl:if>
        </xsl:for-each>
      </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

תנאי choose

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

משתמשים באלמנט
<xsl:choose>

 

ולאחריו
<xsl:when>

 

כמספר הערכים הנבדקים

ולבסוף משתמשים ב-
<xsl:otherwise>

אם אף לא אחד מהערכים התאים דילן באופן שונה משאר האמנים :אם אנו רוצים לדוגמה להציג את בוב

<xsl:choose>
<xsl:when test=".[ARTIST='Bob Dylan']">
... some code ...
</xsl:when>
<xsl:otherwise>
... some code ....
</xsl:otherwise>
</xsl:choose>

מסמך XSL

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
   <html>
   <body>
     <table border="2" bgcolor="yellow">
       <tr>
       <th>Title</th>
       <th>Artist</th>
       </tr>
  <xsl:for-each select="CATALOG/CD">
<tr>
  <td><xsl:value-of select="TITLE"/></td
  <xsl:choose>
     <xsl:when test=".[ARTIST='Bob Dylan']">
       <td bgcolor="#ff0000">
         <xsl:value-of select="ARTIST"/>
       </td>
     </xsl:when>
     <xsl:otherwise>
       <td><xsl:value-of select="ARTIST"/></td>
     </xsl:otherwise>
   </xsl:choose
       </tr>
   </xsl:for-each>
     </table>
   </body>
   </html>
</xsl:template>
</xsl:stylesheet>

4.3.3 copy-of

משתמשים באלמנט זה כדי להעתיק אלמנא בשלמותו ללא הפיכתו קודם למחרוזת. אם ,לדוגמה,p מייצג לנו פיסקה נרצה להעתיק אותו ללא שינוי. בדוגמה הבאה מעתיקים את האלמנט p ואת בנים b שלו למסמך התוצאה:

<xsl:template match="p">
     <xsl:copy-of select="b"/>
     <xsl:apply-templates/>
</xsl:template>

4.3.4 attribute and attribute-set

attribute מוסיף מאפיין לאלמנט המכיל הקרוב ביותר. הוא נמצא בתוך תבנית או בתוך אלמנט arrtibute-set

הדוגמה הבאה יוצרת טבלה עם מאפיין width בעל ערך %100

<table>
<xsl:attribute name="width">100%</xsl:attribute>
</table>

דוגמה זו מגדירה פונט מסויים שנוכל להשתמש בו במסמך התוצאה:

<xsl:attribute-set name="font">
        <xsl:attribute name="font-name">Arial</xsl:attribute>
        <xsl:attribute name="font-size">14px</xsl:attribute>
        <xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:attribute-set>

4.3.5 variable

אלמנט זה מאפשר לשייך משתנה למחרוזת ,צומת או חלק מעץ.

משתנים יכולים להכיל ערך אחד בלבד.

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

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

<xsl:variable name="color">
   <xsl:choose>
       <xsl:when test="@color">
         <xsl:value-of select="@color"/>
       </xsl:when>
       <xsl:otherwise>red</xsl:otherwise>
   </xsl:choose>
</xsl:variable>

כאן ההשמה מתבצעת באמצעות המאפיין test

המאפיין המשמש להגדרת משתנה ב -apply-templates הוא select
וא selectהמאפיין המשמש להגדרת משתנה ב -value-of
המאפיין המשמש להגדרת משתנה ב -number הוא value
המאפיין המשמש להגדרת משתנה ב -for-each הוא select
המאפיין המשמש להגדרת משתנה ב -if הוא test
המאפיין המשמש להגדרת משתנה ב -when הוא test
המאפיין המשמש להגדרת משתנה ב -sort הוא select

4.3.6 number

אלמנט זה מדפיס ערך מספרי בפורמט המבוקש.

מאפיינים:

- count איזה אלמנט לספור- value ערך שאמור להפוך למחרוזת

- format הפורמט שבו הערך אמור להיות מודפס
- grouping-separator המפריד בין קבוצות מספרים
- grouping-size מספר הספרות בכל קבוצה

דוגמאות :

 
<xsl:number value='250000' grouping-size='3' grouping-separator='.'/>

 

מדפיס : 250.00

<xsl:number value='250000' grouping-size='2' grouping-separator=','/>

מדפיס: 25,00,00

<xsl:number value='12' grouping-size='1' grouping-separator='#' format="I"/>

מדפיס :X#I#I

עבודה עם XSL
עוד אודות XML