跳至内容

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章中看到的样式表之上,但请注意嵌套表格的使用,以进一步指定所传达数据的布局。值及其指示器已分隔到表格单元格中,从而使外观更简洁。

华夏公益教科书