跳至內容

XML - 資料交換管理/C.5

來自華夏公益教科書,開放的書籍,開放的世界

XML樣式表

[編輯 | 編輯原始碼]

類似於我們在第3章中訪問的佈局,此樣式表按國家列出了XML文件中的每個酒店。但這次添加了一些新功能。價格範圍元素已包含在內,每個酒店的設施現在都列出,並且每個國家的總人口已格式化以提高可讀性。


XSLT函式

[編輯 | 編輯原始碼]

在格式化XML輸出時,您可能需要處理資料或獲取某些值以進行顯示。函式可以放置在XML樣式表中,以便在轉換過程中操作資料。我們在第3章中看到了一個示例,該示例顯示了城市中的酒店數量。

<xsl:value-of select="count(hotel)" />

為了使我們的樣式表中的總人口更易於閱讀,我們需要將數字分成三組,並新增逗號。為此,我們使用format-number()函式。此函式的目的是使用指定模式將數值轉換為字串,這些模式控制前導零的數量、千位分隔符等。此函式的基本語法如下

format-number (number, pattern)
  • number是要格式化的數值
  • pattern是一個字串,它描述了一個數字的一般表示形式。字串中的每個字元都表示數字中的一個數字,或者一些特殊的標點符號,例如逗號或減號。

為了以三位一組的方式使用逗號作為分隔符來顯示<population>,我們的XML樣式表中的第{51}行使用了format-number函式。

以下是使用樣式表中的format-number函式時用來表示數字格式的字元及其含義


符號含義

  0
  #
  .
  ,
  ;
  -
  %
  X
  ‘

一個數字。
一個數字,零顯示為缺失。
(句點) 十進位制分隔符的佔位符。
分組分隔符的佔位符。
分隔格式。
負數的預設字首。
乘以100並顯示為百分比。
字首或字尾中可以使用任何其他字元。
用於在字首或字尾中引用特殊字元。


在樣式表中,您可能會發現許多其他函式可用。以下是一些在樣式表中處理數字時有用的其他基於數字的函式。

名稱 描述
ceiling() 返回不小於number引數的最小整數
floor() 返回不大於number引數的最大整數
number() 將value引數轉換為數字
round() 將number引數四捨五入到最接近的整數
sum() 返回節點集中的數字值的總和
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"/>
    <xsl:template match="/">
        <HTML>
            <HEAD>
                <TITLE>World Renowned Hotels</TITLE>
                <STYLE TYPE="text/css"> 
                    H2 {TEXT-ALIGN:CENTER;} 
                    .blueBackground
                    {BACKGROUND-COLOR:LIGHTBLUE; COLOR:BLACK; TEXT-ALIGN:LEFT; BORDER-WIDTH:0px; WIDTH:90%;}
                    .blackBackground {BACKGROUND-COLOR:BLACK; TEXT-ALIGN:LEFT; COLOR:WHITE;
                    FONT-SIZE:12pt; BORDER-WIDTH:2px;} </STYLE>
            </HEAD>
            <BODY>
                <H2>* * * Hotels Listings by Country * * *</H2>
                <xsl:apply-templates select="tourGuide"/>
            </BODY>
        </HTML>
    </xsl:template>
    <xsl:template match="tourGuide">
        <xsl:for-each select="city">
            <TABLE CLASS="blackBackground">
                <TR>
                    <TD>
                        <BR/>
                        <TABLE style="width:90%; color:white;" align="center">
                            <TR>
                                <TD>
                                    <BR/>
                                    <b>
                                        <xsl:text>City: </xsl:text>
                                    </b>
                                </TD>
                                <TD>
                                    <BR/>
                                    <xsl:value-of select="cityName"/>
                                </TD>
                            </TR>
                            <TR>
                                <TD>
                                    <b>
                                        <xsl:text>History: </xsl:text>
                                    </b>
                                </TD>
                                <TD>
                                    <xsl:value-of select="history"/>
                                </TD>
                            </TR>
                            <TR>
                                <TD>
                                    <BR/>
                                    <b>
                                        <xsl:text>Country: </xsl:text>
                                    </b>
                                </TD>
                                <TD>
                                    <BR/>
                                    <xsl:value-of select="country"/>
                                </TD>
                            </TR>
                            <TR>
                                <TD>
                                    <b>
                                        <xsl:text>Population: </xsl:text>
                                    </b>
                                    <BR/>
                                    <BR/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="format-number(population, '#,###,##0')"/>
                                    <BR/>
                                    <BR/>
                                </TD>
                            </TR>
                        </TABLE>
                    </TD>
                </TR>
                <TR>
                    <TD colspan="2">
                        <center>
                            <font style="font-size:medium">Hotels:</font>
                            <br/>
                            <xsl:for-each select="hotel">
                                <TABLE CLASS="blueBackground">
                                    <TR>
                                        <TD STYLE="FONT-SIZE:8pt;width:20%;">
                                            <IMG>
                                                <xsl:attribute name="SRC">
                                                  <xsl:value-of select="hotelPicture/@filename"/>
                                                </xsl:attribute>
                                                <xsl:attribute name="WIDTH">
                                                  <xsl:value-of select="hotelPicture/@size"/>
                                                </xsl:attribute>
                                                <xsl:attribute name="HEIGHT">
                                                  <xsl:value-of select="hotelPicture/@size"/>
                                                </xsl:attribute>
                                                <xsl:attribute name="ALT">
                                                  <xsl:value-of select="hotelPicture/@value"/>
                                                </xsl:attribute>
                                            </IMG>
                                            <BR/>
                                        </TD>
                                        <TD align="left" style="FONT-SIZE:10pt;">
                                            <HR width="90%"/>
                                            <b>
                                                <xsl:text>Hotel Name: </xsl:text>
                                            </b>
                                            <xsl:value-of select="hotelName"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Street Address: </xsl:text>
                                            </b>
                                            <xsl:value-of select="streetAddress"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Telephone Number: </xsl:text>
                                            </b>
                                            <xsl:value-of select="telephoneNumber"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Email Address: </xsl:text>
                                            </b>
                                            <xsl:value-of select="emailAddress"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Price Range: $</xsl:text>
                                            </b>
                                            <xsl:value-of select="lowerPrice"/> - <xsl:value-of
                                                select="upperPrice"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Hotel Rating: </xsl:text>
                                            </b>
                                            <xsl:value-of select="hotelRating"/>
                                            <BR/>
                                            <b>
                                                <xsl:text>Amenities: </xsl:text>
                                            </b>
                                            <xsl:for-each select="amenities">
                                                <xsl:value-of select="amenity"/>
                                                <xsl:if test="position() &lt; last()">
                                                  <xsl:text>, </xsl:text>
                                                </xsl:if>
                                            </xsl:for-each>
                                            <HR width="90%"/>
                                        </TD>
                                    </TR>
                                </TABLE>
                                <BR/>
                            </xsl:for-each>
                        </center>
                    </TD>
                </TR>
            </TABLE>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

圖5-5 XML樣式表 – amenity.xsl

在XML樣式表中,您將看到兩個額外的函式position()last()。position函式返回當前上下文節點在當前上下文節點集中的位置。last函式返回上下文中的最後一個節點的索引號。為了列出每個酒店的每個設施,轉換會檢查當前節點的位置是否與集合中最後一個上下文節點的位置不同。如果返回true,則在列出設施時會新增逗號。

儘管此樣式表建立在我們第3章中看到的樣式表之上,但請注意巢狀表格的使用,以進一步指定所傳達資料的佈局。值及其指示器已分隔到表格單元格中,從而使外觀更簡潔。

華夏公益教科書