XML - 管理資料交換/XSLT 和樣式表
XML - 管理資料交換
|
相關主題
|
參與
|
| 上一章 | 下一章 |
| ← CSS | Cocoon → |
|
學習目標
|
在前面的章節中,我們介紹了使用 XSL 樣式表將 XML 文件轉換為 HTML 的基礎知識。本章將簡要回顧這些概念,並介紹許多新概念。它是建立樣式表的參考。
XML 樣式表
[edit | edit source]可擴充套件樣式表語言 (XSL) 提供了一種方法來轉換和格式化 XML 文件的內容以供顯示。它包括兩個部分,XSL 轉換 (XSLT) 用於轉換 XML 文件,以及 XSLFO (XSL 格式化物件) 用於格式化或將樣式應用於 XML 文件。XSL 轉換語言 (XSLT) 用於將 XML 文件從一種形式轉換為另一種形式,包括新的 XML 文件、HTML、XHTML 和文字文件。XSL-FO 可以從 XML 建立 PDF 文件以及其他輸出格式。使用 XSLT,您可以有效地回收內容,重新設計它以用於新文件,或更改它以適應無限的用途。例如,從單個 XML 原始檔,您可以提取一個適合列印的文件,一個適合 Web 的文件,一個適合 Unix 手冊頁面的文件,以及另一個適合線上幫助系統的文件。您還可以選擇從儲存多種語言文字的 XML 源中提取以特定語言編寫的文件的特定部分。可能性是無限的!
XSLT 樣式表是一個 XML 文件,包含完整的元素和屬性。它有兩種型別的元素,頂層元素和指令元素。頂層元素直接位於 stylesheet 根元素之下。指令元素表示一組格式化指令,這些指令規定如何轉換 XML 文件的內容。在轉換過程中,XSLT 會分析 XML 文件或源樹,並將其轉換為節點樹,這是整個 XML 文件的分層表示,也稱為結果樹。每個節點代表 XML 文件的一部分,例如元素、屬性或一些文字內容。XSL 樣式表包含預定義的“模板”,這些模板包含有關如何處理節點的指令。XSLT 將使用 match 屬性將 XML 元素節點與模板相關聯,並將它們轉換為結果文件。
讓我們回顧一下第二章中的樣式表 city.xsl,並更詳細地檢查它。
圖 1:城市實體的 XML 樣式表
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: city.xsl
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Cities</title>
</head>
<body>
<h2>Cities</h2>
<xsl:apply-templates select="cities"/>
</body>
</html>
</xsl:template>
<xsl:template match="cities">
<!-- the for-each element can be used to loop through each node in a specified node set (in this case city) -->
<xsl:for-each select="city">
<xsl:text>City: </xsl:text>
<xsl:value-of select="cityName"/>
<br/>
<xsl:text>Population: </xsl:text>
<xsl:value-of select="cityPop"/>
<br/>
<xsl:text>Country: </xsl:text>
<xsl:value-of select="cityCountry"/>
<br/>
<br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
- 由於樣式表是一個 XML 文件,因此它以 XML 宣告開頭。這包括偽屬性
encoding和standalone。它們被稱為偽屬性,因為它們與元素屬性不同。standalone 屬性允許您直接指定外部 DTD <xsl:stylesheet>標籤宣告樣式表的開始,並標識版本號和官方 W3C 名稱空間。注意 XSLT 名稱空間的常規字首 xsl。宣告字首後,必須將其用於所有元素。<xsl:output>標籤是一個可選元素,它決定如何輸出結果樹。<xsl:template>元素定義模板的開始,幷包含在匹配指定節點時應用的規則。match屬性用於將模板與 XML 元素(在本例中為 XML 源文件的根 (/) 或整個分支)相關聯(匹配)。- 如果未指定輸出方法,則輸出將預設設定為 HTML,在本例中,因為根元素是
<html>開始標籤。 apply-templates元素是一個空元素,因為它沒有字元內容。它將模板規則應用於當前元素或元素的子節點。select屬性包含一個位置路徑,告訴它處理哪個元素的內容。- 指令元素
value-of提取所選節點子節點的字串值,在本例中為cityName的文字節點子節點。
template 元素定義執行更改的規則。這可以是任何數量的事情,包括簡單的純文字轉換、新增或刪除 XML 元素,或者只是轉換為 HTML,當模式匹配時。在元素的 match 屬性中定義的模式包含一個簡化的 XPath 位置路徑。這基本上是文件中根元素的名稱,在本例中為“tourGuide”。
在將 XML 文件轉換為 HTML 時,處理器期望樣式表中的元素格式良好,就像 XML 一樣。這意味著所有元素都必須有結束標籤。例如,看到單獨的 <p> 標籤並不罕見。XSLT 處理器要求具有開始標籤的元素必須以結束標籤關閉。對於 <br> 元素,這意味著使用 <br></br> 或 <br />。 如第三章所述,br 元素是一個空元素。這意味著它在標籤之間不包含任何內容,但它可能具有屬性。雖然 HTML 輸出不會輸出任何結束標籤,但它們在樣式表中仍然必須具有結束標籤。例如,在樣式表中,您將列出:<img src="picture.jpg"></img> 或作為空元素 <img src="picture.jpg" /> 。HTML 輸出將刪除結束標籤,使其看起來像這樣:<img src="picture.jpg"> 另外,處理器將識別 html 標籤,無論它們採用什麼大小寫 - BODY、body、Body 都被解釋為相同。
輸出
[edit | edit source]XSLT 可用於將 XML 源轉換為許多不同型別的文件。XHTML 也是 XML,如果它格式良好,那麼它也可以用作源或結果。但是,將純 HTML 轉換為 XML 不會起作用,除非它首先被轉換為 XHTML 以符合 XML 1.0 建議。以下是 XSLT 執行的所有可能的型別到型別轉換的列表。
圖 2:型別到型別轉換
| XML | XHTML | HTML | 文字 | |
| XML | X | X | X | X |
| XHTML | X | X | X | X |
| HTML | ||||
| 文字 |
樣式表中的 output 元素決定如何輸出結果樹。此元素是可選的,但它允許您更好地控制輸出。如果您不包含它,輸出方法將預設為 XML,或者如果結果樹中的第一個元素是 <html> 元素,則預設為 HTML 輸出。圖 3 列出了屬性。
圖 3:元素輸出屬性 (來自 Wiley:Michael Fitzgerald 編著的 XSL Essentials)
| 屬性 | 描述 |
| cdata-section-elements | 指定包含結果樹中 CDATA 部分的空格分隔的元素名稱列表。 CDATA 轉義通常被解釋為標記的字元,例如 < 或 &。 |
| doctype-public | 將公共識別符號放置在結果樹中文件型別宣告中。 |
| doctype-system | 將公共識別符號放置在結果樹中文件型別宣告中。 |
| encoding | 設定首選編碼型別,例如 UTF-8、ISO-8859 等。這些值不區分大小寫。 |
| indent | 指示 XSLT 處理器可以縮排結果樹中的內容。可能的值是
|
| media-type | 設定結果樹內容的媒體型別(MIME 型別)。 |
| method | 指定輸出型別。合法值為 xml、html、text 或其他限定名稱。 |
| omit-xml-declaration | 告訴 XSLT 處理器是否包含 XML 宣告。 |
| standalone | 告訴 XSLT 處理器在 XML 宣告中包含偽屬性(如果未省略),其值為 "yes" 或 "no"。這指示文件是否依賴於外部標記宣告,例如外部 DTD 中的宣告。 |
| version | 設定輸出方法的版本號,例如用於輸出的 XML 版本(預設值為 1.0)。 |
XML 到 XML
[edit | edit source]由於我們已經對將 XML 文件轉換為 HTML 進行了大量的練習,因此我們將使用第二章中使用的 city.xml,使用 host.xsd 作為模式將其轉換為另一個 XML 檔案。
圖 4:城市實體的 XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: city.xml
-->
<cities xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='host.xsd'>
<city>
<cityID>c1</cityID>
<cityName>Atlanta</cityName>
<cityCountry>USA</cityCountry>
<cityPop>4000000</cityPop>
<cityHostYr>1996</cityHostYr>
</city>
<city>
<cityID>c2</cityID>
<cityName>Sydney</cityName>
<cityCountry>Australia</cityCountry>
<cityPop>4000000</cityPop>
<cityHostYr>2000</cityHostYr>
<cityPreviousHost>c1</cityPreviousHost >
</city>
<city>
<cityID>c3</cityID>
<cityName>Athens</cityName>
<cityCountry>Greece</cityCountry>
<cityPop>3500000</cityPop>
<cityHostYr>2004</cityHostYr>
<cityPreviousHost>c2</cityPreviousHost >
</city>
</cities>
圖 5:按城市 ID 列出城市的城市實體的 XSL 文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:for-each select="//city[count(cityPreviousHost) = 0]">
<br/><xsl:text>City Name: </xsl:text><xsl:value-of select="cityName"/><br/>
<xsl:text> Rank: </xsl:text><xsl:value-of select="cityID"/><br/>
<xsl:call-template name="output">
<xsl:with-param name="context" select="."/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="output">
<xsl:param name="context" select="."/>
<xsl:for-each select="//city[cityPreviousHost = $context/cityID]">
<br/><xsl:text>City Name: </xsl:text> <xsl:value-of select="cityName"/><br/>
<xsl:text> Rank: </xsl:text><xsl:value-of select="cityID"/><br/>
<xsl:call-template name="output">
<xsl:with-param name="context" select="."/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
圖 6:主機城市實體的 XML 模式
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:element name="cities">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="city" type="cityType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="cityType">
<xsd:sequence>
<xsd:element name="cityID" type="xsd:ID"/>
<xsd:element name="cityName" type="xsd:string"/>
<xsd:element name="cityCountry" type="xsd:string"/>
<xsd:element name="cityPop" type="xsd:integer"/>
<xsd:element name="cityHostYr" type="xsd:integer"/>
<xsd:element name="cityPreviousHost" type="xsd:IDREF" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
圖 7:城市實體的 XML 樣式表
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: city2.xsl
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:attribute-set name="date">
<xsl:attribute name="year">2004</xsl:attribute>
<xsl:attribute name="month">03</xsl:attribute>
<xsl:attribute name="day">19</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="tourGuide">
<xsl:processing-instruction name="xsl-stylesheet"> href="style.css" type="text/css"<br />
</xsl:processing-instruction>
<xsl:comment>This is a list of the cities we are visiting this week</xsl:comment>
<xsl:for-each select="city">
<!-- element name creates a new element where the value of the attribute name sets name of
the new element. Multiple attribute sets can be used in the same element -->
<!-- use-attribute-sets attribute adds all the attributes declared in attribute-set from above -->
<xsl:element name="cityList" use-attribute-sets="date">
<xsl:element name="city">
<xsl:attribute name="country">
<xsl:apply-templates select="country"/> </xsl:attribute>
<xsl:apply-templates select="cityName"/>
</xsl:element>
<xsl:element name="details">Will write up a one page report of the trip</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
- 雖然
output method設定為“xml”,但由於結果樹的根沒有<html>元素,因此它將預設輸出為 XML。 attribute-set是一個頂層元素,它透過名稱“date”建立一組屬性。這個屬性集可以在整個樣式表中重複使用。attribute-set元素也具有 use-attribute-sets 屬性,允許您將多個屬性集連結在一起。processing-instruction生成 XML 樣式表處理指令。comment元素在結果樹中建立註釋。attribute元素允許您向結果樹中建立的元素新增屬性。
樣式表生成此結果樹
圖 8:城市實體的 XML 結果樹
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
Document: city2.xsl
-->
<?xsl-stylesheet href="style.css" type="text/css"?>
<!--This is a list of the cities we are visiting this week-->
<cityList year="2004" month="03" day="19">
<city country="Belize">Belmopan</city>
<details>Will write up a one page report of the trip</details>
</cityList>
<cityList year="2004" month="03" day="19">
<city country="Malaysia">Kuala Lumpur</city>
<details>Will write up a one page report of the trip</details>
</cityList>
</stylesheet>
處理器會在結果樹的頂部自動插入 XML 宣告。處理指令 (PI) 是供處理應用程式使用的指令。在本例中,href 指向本地樣式表,該樣式表將在處理 XML 文件時應用於該文件。我們使用 <xsl:element> 在結果樹中建立新內容並向其新增屬性。
還有另外兩個指令元素用於將節點插入結果樹。它們是 copy 和 copy-of。與 apply-templates 不同,apply-templates 僅複製子節點的內容(如子文字節點),這些元素會複製所有內容。以下程式碼展示瞭如何使用 copy 元素複製 city.xml 中的 city 元素
圖 9:Copy 元素
<xsl:template match="city">
<xsl:copy />
</xsl:template>
結果如下所示
圖 10:Copy 元素結果
<?xml version="1.0" encoding="utf-8">
<city />
<city />
輸出並不十分有趣,因為 copy 不會拾取子節點,而只會拾取當前節點。在我們的示例中,它拾取了 city.xml 檔案中的兩個 city 節點。copy 元素有一個可選屬性 use-attribute-sets,它允許您向元素新增屬性。但是,它會保留任何其他屬性,除了名稱空間(如果存在)。以下是如果在源文件中聲明瞭名稱空間(在本例中為預設名稱空間)的結果
圖 11:名稱空間結果
<?xml version="1.0" encoding="utf-8">
<city xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<city xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
如果您想從原始檔中複製不止一個節點,copy-of 元素將包含當前節點以及與其關聯的任何屬性節點。這包括可能存在的任何節點,例如名稱空間節點、文字節點和子元素節點。當我們將 copy-of 元素應用於 city.xml 時,結果幾乎是 city.xml 的精確副本!您還可以使用 <xsl:copy-of select="comment()"/> 和 <xsl:copy-of select="processing-instruction(name)"/> 複製註釋和處理指令,其中 name 是您希望檢索的處理指令中 name 屬性的值。
您可能會問,這有什麼用?有時您只想獲取節點並進行操作!例如,如果您想將 city.xml 的副本放置到 SOAP 信封中,可以使用 copy-of 很容易地做到這一點。如果您還不知道,簡單物件訪問協議 (SOAP) 是用於打包 XML 文件以進行交換的協議。這在 B2B 環境中非常有用,因為它提供了一種打包 XML 訊息的標準方法。您可以在 www.w3.org/tr/soap 上閱讀有關 SOAP 的更多資訊。
使用 XML 編輯器建立上述 XML 樣式表,並嘗試使用 copy 和 copy-of 元素。
模板
[edit | edit source]由於模板定義了更改節點的規則,因此有意義的是對它們進行重用,無論是在同一個樣式表中還是在其他樣式表中。這可以透過命名模板來實現,然後使用 call-template 元素來呼叫它。還可以包含來自其他樣式表的命名模板。您會很快了解到這在實際應用中有多麼有用。以下是一個使用命名模板的示例
圖 110:命名模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match=" /">
<xsl:call-template name="getCity" />
</xsl:template>
<xsl:template name="getCity">
<xsl:copy-of select="city" />
</xsl:template>
</xsl:stylesheet>
模板還具有 mode 屬性。這允許您多次處理一個節點,每次產生不同的結果,具體取決於模板。讓我們建立一個樣式表來練習模式。
圖 12:XML 模板模式
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: cityModes.xsl
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="tourGuide">
<html>
<head>
<title>City - Using Modes</title>
</head>
<body>
<xsl:for-each select="city">
<xsl:apply-templates select="cityName" mode="title" />
<xsl:apply-templates select="cityName" mode="url" />
<br />
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template match="cityName" mode="title">
<h2><xsl:value-of select="current()"/></h2>
</xsl:template>
<xsl:template match="cityName" mode="message">
<p>Come visit <b><xsl:value-of select="current()" /></b>!</p>
</xsl:template>
</xsl:stylesheet>
apply-templates select="cityName" mode="title"告訴處理器查詢具有相同 mode 屬性值的模板value-of select="current()"返回當前節點,該節點使用value-of轉換為字串。使用select="."也會返回當前節點。
結果並不十分令人滿意,因為我們沒有對檔案進行太多操作,但它能夠說明問題。
圖 13:來自上述樣式表的結果
<h2>Belmopan</h2>
Come visit <b>Belmopan</b>!
<h2>Kuala Lumpur</h2>
Come visit <b>Kuala Lumpur</b>!
預設情況下,XSLT 處理器具有內建的模板規則。如果您應用一個沒有匹配規則的樣式表,並且它未能匹配模式,則會自動應用預設規則。預設規則輸出所有元素的內容。
排序
[edit | edit source]編寫“格式良好”的程式碼 XML 至關重要。但是,有時,僅僅顯示資訊(資料管理的最基本級別)並不是正確識別專案所必需的。作為資訊科技專家,必須充分了解順序對於解釋至關重要。可以透過將資料放到易於讀取的格式中來實現順序。然後,這些資訊就會變得易於使用。使用比較模型或簡單地查詢特定名稱或專案變得非常容易。查詢特定音樂藝術家、標題或音樂型別變得非常容易。作為資訊專家,您必須充分意識到,通常需要對資訊進行排序。XMLT 中排序的基礎是 xsl:sort 命令。xsl:sort 元素體現了排序鍵元件。排序鍵元件標識如何為排序資訊中的每個專案標識排序鍵值。排序鍵值定義為“使用第 N 個排序鍵元件為專案計算的值”。排序鍵元件的重要性透過其 select 屬性或包含的序列構造器來實現。序列構造器定義為“樣式表中零個或多個同級節點的序列,這些節點可以計算為返回節點和原子值的序列”。在某些情況下,兩者都不存在。在這種情況下,預設值為 select=".",如果它是原子值,則對專案的實際值進行排序,如果它是節點,則對專案的型別值進行排序。如果存在 select 屬性,則其值必須是 Xpath 表示式。
以下是 <xsl:sort> 元素用於對輸出進行排序的方式。
排序資訊按如下方式儲存:在 XML 中對輸出進行排序非常容易,方法是在 XSL 檔案中的 <xsl:for-each> 元素之後新增 <xsl:sort> 元素。
圖 14:包含排序功能的樣式表
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>TourGuide Example</h2>
<xsl:apply-templates select="cities"/>
</body>
</html>
</xsl:template>
<xsl:template match="cities">
<xsl:for-each select="city">
<xsl:sort select="cityName"/>
<xsl:value-of select="cityName"/>
<xsl:value-of select="cityCountry"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
此示例將按藝術家名稱對檔案進行字母排序。注意:select 屬性指示要排序的 XML 元素。可以按“標題”或“藝術家”選擇和排序資訊。這些是 XML 文件將在檔案主體中顯示的類別。
我們之前已使用 sort 函式對 if 語句的結果進行排序。sort 元素還有許多其他用途。它本質上指示處理器根據某些標準對節點進行排序,這稱為排序鍵。它預設按升序對元素進行排序。以下是對 sort 使用的不同屬性的簡短列表
圖 15:排序屬性
| 屬性 | 描述 |
select
|
指定要處理的節點 |
order
|
指定排序順序:“ascending” 或 “descending” |
case-order
|
確定大寫文字是否在小寫文字之前排序:“upper-first” 或 "lower-first" |
data-type
|
預設按文字資料排序:“text”、“number” 或 QName(限定名) |
lang
|
指示所使用的語言,因為某些語言使用不同的字母表。“en”、“de”、“fr”等。如果未指定值,則從系統環境確定語言。 |
sort 元素可以在 apply-templates 或 for-each 元素中使用。它還可以在一個模板中或在多個模板中使用多次,以建立子排序級別。
編號
[edit | edit source]number 指令元素允許您在結果中插入數字。結合 sort 元素,您可以輕鬆地建立編號列表。當將此簡單的樣式表 hotelNumbering.xsl 應用於 city_hotel.xml 時,我們將獲得下面列出的結果
圖 16:排序和編號列表
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Document: hotelNumbering.xsl
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="tourGuide/city/hotel">
<xsl:sort/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="hotel">
<xsl:number value="position()" format="
 0. "/>
<xsl:value-of select="hotelName"/>
</xsl:template>
</xsl:stylesheet>
圖 17:hotelNumbering.xsl 結果
1. Bull Frog Inn 2. Mandarin Oriental Kuala Lumpur 3. Pan Pacific Kuala Lumpur 4. Pook's Hill Lodge
value 中的表示式將被計算,而 position() 的值將基於排序後的節點列表。為了改善外觀,我們添加了 format 屬性,其中包含一個換行符字元引用 (
)、一個零位數字(表示數字將是零位數字,表示該數字將是整數型別)以及一個句號和一個空格,以使它看起來更美觀。格式列表可以基於以下序列
圖 17:編號格式
format=" A. "– Uppercase lettersformat=" a. "– Lowercase lettersformat=" I. "– Uppercase Roman numeralsformat=" i. "– Lowercase Roman numeralsformat=" 000. "– Numeral prefixformat=" 1- "– Integer prefix/ hyphen prefix
為了指定不同級別的編號,例如源文件的節和子節,使用level屬性,它告訴處理器應該考慮源樹的哪些級別。預設情況下,它設定為single,如上面的示例所示。它還可以取multiple和any的值。count屬性是一個模式,告訴處理器要計算哪些節點(為了編號)。如果未指定,則預設為與當前節點相同的節點型別的模式。from屬性也可以用來指定計數應該從哪個節點開始。
當level設定為single時,處理器會搜尋與count的值匹配的節點,如果不存在,它會匹配當前節點。當它找到匹配項時,它會建立一個節點列表並計算所有匹配型別的節點。如果列出了from屬性,它會告訴處理器從哪裡開始計數,而不是計算所有節點。
當level為multiple時,它不僅會計算一個節點型別的列表,它還會建立一個包含當前節點的所有祖先節點的列表,按照源文件中的實際順序排列。建立此列表後,它會選擇所有與count中表示的節點匹配的節點。然後它對映每個匹配count的節點的前導同級節點的數量。實際上,multiple會分別記住所有節點。這就是any與眾不同的地方。它會按順序編號所有元素,而不是在多個級別上進行計數。與其他兩個值一樣,可以使用from屬性告訴處理器從哪裡開始計數,這實際上會將它分成多個級別。
這是上面示例使用level="multiple"的修改版本。
圖 18:排序和編號列表
<!--
Document: hotelNumbering2.xsl
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="tourGuide//hotelName"/>
</xsl:template>
<xsl:template match="hotel">
<xsl:number level="multiple"
count="city|hotel" format="
 1.1 "/>
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
圖 19:結果 - hotelNumbering2.xsl
1.1 Bull Frog Inn 1.2 Pook's Hill Lodge 2.1 Pan Pacific Kuala Lumpur 2.2 Mandarin Oriental Kuala Lumpur
第一個模板匹配根節點,然後選擇所有具有country作為祖先的hotel節點,建立一個節點列表。下一個模板遞迴地處理amenityName元素,並根據屬性中amenityName例項的數量為每個例項提供一個編號。這是透過計算前面同級的數量再加上1來實現的。
格式化
[edit | edit source]格式化數字是一個簡單的過程,因此本節將簡要概述可以做些什麼。放置在 XML 樣式表中,可以使用函式在轉換期間操作資料。為了使數字更容易閱讀,我們需要能夠將數字分成組,或者新增逗號或小數點。為此,我們使用format-number()函式。此函式的目的是使用指定的模式將數值轉換為字串,這些模式控制前導零的數量、千位分隔符等等。此函式的基本語法如下:format-number (number, pattern)
數字pattern是一個字串,它規定了數字的一般表示形式。字串中的每個字元都代表數字中的一個數字或一些特殊標點符號,例如逗號或減號。
以下是用於在樣式表中使用 format-number 函式時表示數字格式的字元及其含義
圖 20:Format-number 函式
Symbol Meaning
0 A digit.
# A digit, zero shows as absent.
. (period) Placeholder for decimal separator.
, Placeholder for grouping separator.
; Separate formats.
- Default prefix for negative.
% Multiply by 100 and show as a percentage.
X Any other characters can be used in the prefix or suffix.
‘ Used to quote special characters in a prefix or suffix.
條件處理
[edit | edit source]有時需要根據條件顯示輸出。有兩個指令元素可以讓你有條件地確定哪個模板將根據某些測試來使用。它們是if和choose元素。
if語句的測試條件必須包含在<xsl:if>元素的test屬性中。測試大於和小於運算子的表示式必須分別用“>”和“<”來表示,以便進行適當的轉換。XPath 中的not()函式是一個布林函式,如果其引數為假,則計算結果為真,反之亦然。and和or條件可以用來組合多個測試,但if語句最多隻能測試一個表示式。它也只能例項化一個模板的使用。
when元素類似於 Java 中的else語句。透過使用when元素,choose元素可以提供多種備選表示式。choose 元素必須包含至少一個 when 語句,但它可以包含任意多個 when 語句。choose 元素還可以包含一個 otherwise 元素例項,它就像 Java 程式中的最後一個 else 一樣。如果其他表示式都不為真,它將包含該模板。
for-each元素是另一個條件處理元素。我們在前面的章節練習中已經使用過它,因此這裡將簡要回顧一下。for-each元素是一個指令元素,這意味著它必須是模板元素的子元素。for-each根據select屬性的值或表示式計算結果為一個節點集,並按文件順序或排序順序處理每個節點。
引數和變數
[edit | edit source]XSLT 提供了兩個類似的元素,variable和param。兩者都有一個必需的name屬性,以及一個可選的select屬性,並且你像這樣宣告它們
圖 21:變數和引數宣告
<xsl:variable name="var1" select="''"/>
<xsl:param name="par1" select="''"/>
上面的宣告已繫結到一個空字串,這與你省略了 select 屬性的效果相同。對於引數,此值僅被視為預設值或初始值,可透過命令列或使用with-param元素的另一個模板進行更改。但是,對於變數,作為一個通用的規則,該值被設定並且不能動態更改,除非在特殊情況下。在進行宣告時,請記住,變數可以在模板中的任何位置宣告,但引數必須在模板的開頭宣告。
這兩個元素也可以具有全域性和區域性作用域,這取決於它們定義的位置。如果它們在<stylesheet>元素下最高級別定義,則它們具有全域性作用域,可以在樣式表中的任何位置使用。如果它們在模板中定義,則它們是區域性的,只能在該模板中使用。在模板中宣告的變數和引數僅對它們宣告的模板以及它們下面的模板可見。它們具有級聯效果:它們可以從頂層向下傳遞到一個模板中,再向下傳遞到該模板中的另一個模板中等等,但它們不能向上回溯!
我們將使用select屬性在引數的宣告元素中硬編碼一個值。
圖 22:HTML 結果
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: countryParam.xsl
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:param name="country" select="'Belize'"/>
<xsl:param name="code" />
<xsl:template match="/">
<xsl:apply-templates select="country-codes" />
</xsl:template>
<xsl:template match="country-codes">
<xsl:apply-templates select="code" />
</xsl:template>
<xsl:template match="code">
<xsl:choose>
<xsl:when test="countryName[. = $country]">
The country code for
<xsl:value-of select="countryName"/> is
<xsl:value-of select="countryCode"/>.
</xsl:when>
<xsl:when test="countryCode[. = $code]">
The country for the code
<xsl:value-of select="countryCode"/> is
<xsl:value-of select="countryName"/>.
</xsl:when>
<xsl:otherwise>
Sorry. No matching country name or country code.
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
你傳遞的值不必用引號括起來,除非你傳遞一個包含多個單詞的值。例如,我們可以傳遞 country="United States" 或 country=Belize 而不出現錯誤。
變數的值也可以用來設定屬性值。以下是一個使用$code變數中值的 countryCode 屬性設定 countryName 元素的示例
圖 23:countryCode 屬性
<countryName countryCode="{$code}"></countryName>
這被稱為屬性值模板。請注意,引數周圍使用了大括號。這告訴處理器將內容評估為表示式,然後將結果轉換為結果樹中的字串。有些屬性不能使用屬性值模板設定
- 包含模式的屬性(例如
apply-templates中的select) - 頂級元素的屬性
- 引用命名物件的屬性(例如
template的name屬性)
引數雖然不是變數,但可以使用with-param元素在模板之間傳遞。此元素有兩個屬性,name是必需的,select是可選的。以下示例使用 with-param 作為call-template元素的子元素,儘管它也可以用作apply-templates的子元素。
圖 24:XSL With-Param
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document: withParam.xsl
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="tourGuide/city"/>
</xsl:template>
<xsl:template match="city">
<xsl:call-template name="countHotels">
<xsl:with-param name="num" select="count(hotel)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="countHotels">
<xsl:param name="num" select="''" />
<xsl:text>City Name: </xsl:text>
<xsl:value-of select="cityName" />
<xsl:text>
</xsl:text>
<xsl:text>Number of hotels: </xsl:text>
<xsl:value-of select="$num" />
<xsl:text>

</xsl:text>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="city">在這裡,我們匹配在apply-templates節點集中返回的city節點。call-template,如前所述,呼叫名為countHotels的模板。with-param元素告訴被呼叫的模板使用名為num的引數,並且 select 語句設定將被評估的表示式。- 請注意,引數的宣告位於模板的第一行。它將
num例項化為一個空字串,因為該值將被with-param元素的select屬性中表達式的值替換。 
在結果樹中輸出一個換行符,以使輸出看起來更漂亮。
圖 25:文字結果 - withParam.xsl
City Name: Belmopan
Number of hotels: 2
City Name: Kuala Lumpur
Number of hotels: 2
Muenchian 方法
[edit | edit source]Muenchian 方法是 Steve Muench 開發的一種使用鍵執行函式的方法。鍵透過將鍵值分配給節點並允許你透過鍵值訪問該節點來工作。如果有很多具有相同鍵值的節點,那麼當你使用該鍵值時,所有這些節點都會被檢索。實際上,這意味著如果你想根據節點的特定屬性對一組節點進行分組,那麼你可以使用鍵將它們分組在一起。Muenchian 方法最常見的用途之一是將專案分組並計算該組中出現的次數,例如城市出現的次數。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:key name="Count" match="*/city" use="cityName" />
<xsl:template match="cities">
<xsl:for-each
select="//city[generate-id()=generate-id(key('Count', cityName)[1])]">
<br/><xsl:text>City Name:</xsl:text><xsl:value-of select="cityName"/><br/>
<xsl:text>Number of Occurences:</xsl:text>
<xsl:value-of select="count(key('Count', cityName))"/>
<br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
文字結果 - muenchianMethod.xsl
City Name: Atlanta
Number of Occurrences: 1
City Name: Athens
Number of Occurrences: 1
City Name: Sydney
Number of Occurrences: 1
資料型別
[edit | edit source]XSLT 中有五種不同的資料型別:節點集、字串、數字、布林值和結果樹片段。變數和引數可以繫結到它們中的每一個,但最後一種型別是它們特有的。
節點集在 XSLT 中無處不在。我們已經看到它們從apply-templates和for-each 元素以及變數中返回。現在我們將看到如何將變數繫結到節點集。檢查以下程式碼
圖 26:繫結到節點集的變數
<xsl:variable name="cityNode" select="city" />
...
<xsl:template match="/">
<xsl:apply-templates select="$cityNode/cityName" />
</xsl:template>
這裡,我們將變數 `$cityNode` 的值設定為源樹中節點集 `city`。`cityName` 元素是 `city` 的子元素,因此 `apply-templates` 生成的輸出是 `cityName` 的文字節點。請記住,您可以在表示式中使用變數引用,但不能在模式中使用。這意味著我們不能使用引用 `$cityNode` 作為 `match` 屬性的值。
如果您只對節點的文字感興趣,而不是對整個節點集感興趣,則字串型別很有用。字串型別使用 XPath 函式,最顯著的是 `string()`。這只是一個簡單的例子
圖例 27:字串型別
<xsl:variable name="cityName" select="string('Belmopan')" />
實際上,這是另一種更長的說法
圖例 28:上述的簡短版本
<xsl:variable name="cityName" select="' Belmopan'" />
也可以宣告一個具有數字值的變數。您可以使用 XPath 函式 `number()` 來完成此操作。
圖例 29:宣告具有數字值的變數
<xsl:variable name="population" select="number(11100)" />
您可以使用 + - * / 等數值運算子對數字執行數學運算,以及一些內建的 XPath 函式,例如 `sum()` 和 `count()`。
布林型別只有兩個可能的值:真或假。例如,我們將使用一個布林變數來測試是否已將引數傳遞到樣式表中。
圖例 30:測試布林變數
<xsl:param name="isOk" select="''" />
<xsl:template match="city" />
<xsl:choose>
<xsl:when test="boolean($isOk)">
…logic here…
</xsl:when>
<xsl:otherwise>
Error: must use parameter isOk with any value to apply template
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我們從引數 `isOk` 的空字串宣告開始。在 `when` 的 `test` 屬性中,`boolean()` 函式測試 `isOk` 的值。如果該值為一個空字串,就像我們預設定義的那樣,`boolean()` 將評估為 `false()`,並且不會例項化模板。如果它確實具有一個值,並且它可以是任何值,`boolean()` 將評估為 `true()`。
最後的資料型別是結果樹片段。本質上,它是一個可以包含標記的文字塊(字串)。在我們深入細節之前,讓我們看一個例子
圖例 31:結果樹片段資料型別
<xsl:variable name="fragment">
<description>Belmopan is the capital of Belize</description>
</xsl:variable>
請注意,我們沒有使用 `select` 屬性來定義變數。我們不是選擇一個節點並獲取它的值,而是建立任意文字。相反,我們將其宣告為元素的內容。變數標籤的開始和結束之間的文字是結果樹的實際片段。通常,如果您像之前那樣使用 `select` 屬性,並且在宣告變數時沒有指定內容,則元素為空元素。如果您不使用 `select` 並且您確實指定了內容,則內容是結果樹。您可以像處理字串一樣對它進行操作,但與節點集不同,您不能使用 / 或 // 等運算子來訪問節點。您從變數中檢索內容並將其放入結果樹的方法是使用 `copy-of` 元素。讓我們看看如何做到這一點
圖例 32:檢索並放入結果樹
<xsl:template match="city"
<xsl:copy-of select="cityName" />
<xsl:copy-of select="$fragment" />
</xsl:template>
結果樹現在將包含兩個元素:`city` 元素的副本和新增的元素 `description`。
EXSLT
[edit | edit source]EXSLT 是對 XSLT 的一組社群開發的擴充套件。模組包括處理日期和時間、數學和字串的功能。
多個樣式表
[edit | edit source]在前面的章節中,我們已經匯入並使用了多個 XML 和模式文件。也可以使用 `import` 和 `include` 元素來使用多個樣式表,這些元素應該很熟悉。還可以使用 XSLT 函式 `document()` 在一個樣式表中一次處理多個 XML 文件。
包含外部樣式表與我們在前面的章節中使用模式所做的非常相似。`include` 元素只有一個屬性,即 `href`。它是必需的,並且始終包含指向檔案位置的 URI(統一資源識別符號)引用,該位置可以是本地的(在同一個本地目錄中)或遠端的。您可以根據需要包含任意多個樣式表,只要它們位於頂層即可。如果您願意,它們可以散佈在整個樣式表中,只要它們是 `<stylesheet>` 元素的子元素即可。當處理器遇到 `include` 的一個例項時,它會用包含文件中的所有元素替換該例項,包括模板規則和頂層元素,但不包括根 `<stylesheet>` 元素。所有專案只是成為樣式表樹本身的一部分,處理器對它們都進行相同的處理。以下是包含本地和遠端樣式表的宣告
圖例 33:本地和遠端樣式表的宣告
<xsl:include href="city.xsl" />
<xsl:include href="http://www.somelocation.com/city.xsl"/>
由於 `include` 返回包含樣式表中的所有元素,因此您需要確保您要包含的樣式表不會包含您自己的樣式表。例如,如果 `city_hotel.xsl` 有一個包含 `city.xsl` 的 `include` 元素,則 `city.xsl` 不能包含 `city_hotel.xsl`。當包含多個檔案時,您需要確保您沒有多次包含另一個樣式表。如果 `city_hotel.xsl` 包含 `amenity.xsl`,`country.xsl` 包含 `amenity.xsl`,`city.xsl` 包含 `city_hotel.xsl` 和 `country.xsl`,則它間接包含了 `amenity.xsl` 兩次。這會導致模板規則重複和錯誤。這些是一些令人困惑的規則,但如果您在包含之前仔細檢查樣式表,則很容易避免這些規則。
匯入樣式表和包含樣式表之間的區別在於,匯入的每個模板規則都有不同的匯入優先順序,而包含的樣式表模板則合併到一個樹中並正常處理。匯入的模板形成一個匯入樹,包括根 `<stylesheet>` 元素,以便處理器可以跟蹤它們的匯入順序。與 `include` 一樣,`import` 也有一個屬性 `href`,它是必需的,並且應該包含文件的 URI 引用。它也是一個頂層元素,可以根據需要使用多次。但是,它必須是 `<stylesheet>` 元素的直接子元素,否則會發生錯誤。此程式碼演示了匯入本地樣式表
圖例 34:匯入本地樣式表
<xsl:import href="city.xsl" />
`import` 元素的順序決定了匹配的模板將相互覆蓋的優先順序。最後匯入的模板優先順序高於最先匯入的模板。但是,`template` 元素也有一個 `priority` 屬性,它可以影響其優先順序。`priority` 屬性中的數字越大,優先順序越高。匯入優先順序僅在模板衝突時生效,否則匯入樣式表與包含樣式表並沒有太大區別。處理衝突模板的另一種方法是使用 `apply-imports` 元素。如果匯入文件中的模板與匯入文件中的模板衝突,則 `apply-templates` 將覆蓋該規則並導致呼叫匯入的模板。
`document()` 函式允許您處理其他 XML 文件及其節點。該函式從使用表示式的任何屬性(例如 `select` 屬性)呼叫。例如
圖例 35:`document()` 函式
<xsl:template match="hotel">
<xsl:element name="amenityList">
<xsl:copy-of select="document('amenity.xml')" />
</xsl:element>
</xsl:template>
當應用於僅包含一個空 `hotel` 元素的 xml 文件時,例如 `<hotel></hotel>`,結果樹將新增一個名為 `amenityList` 的新元素,並將來自 `amenity.xml`(除 XML 宣告外)的所有內容放置其中。`document` 函式可以接受許多其他引數,例如遠端 URI 和節點集,僅舉幾例。有關使用 `document()` 的更多資訊,請訪問 http://www.w3.org/TR/xslt#document
XSL-FO
[edit | edit source]XSL-FO 代表可擴充套件樣式表語言格式化物件,它是一種用於格式化 XML 資料的語言。在它建立時,XSL 最初被分成兩部分,XSL 和 XSL-FO。這兩部分現在正式稱為 XSL。XSL-FO 文件定義了許多矩形區域以顯示輸出。XSL-FO 用於格式化 XML 資料以輸出到螢幕、紙張或其他媒體,例如 PDF 格式。有關更多資訊,請訪問 https://w3schools.tw/xslfo/default.asp
總結
[edit | edit source]| XML 樣式表可以輸出 XML、文字、HTML 或 XHTML。當 XSL 處理器轉換 XML 文件時,它會將其轉換為一個節點結果樹,每個節點都可以根據樣式表中包含的規則進行操作、提取、建立或保留。樣式表的根元素是 `<stylesheet>` 元素。樣式表包含頂層元素和指令元素。模板使用 XPath 位置來匹配源樹中節點的模式,然後在找到匹配項時將定義的規則應用於節點。模板可以命名、具有模式或優先順序。來自源樹的節點集可以排序或格式化。XSLT 使用 `for-each` 和 `if` 元素進行條件處理。XSLT 還支援使用變數和引數。有五種基本資料型別:節點集、字串、數字、布林值和結果樹片段。樣式表還可以 `include` 或 `import` 其他樣式表,甚至其他 XML 文件。XSL-FO 用於將資料格式化為矩形物件。 |
參考部分
[edit | edit source]圖例 36:XSL 元素 (來自 https://w3schools.tw/xsl/xsl_w3celementref.asp 和 http://www.w3.org/TR/xslt#element-syntax-summary)
| 元素 | 描述 | 類別 |
| apply-imports | 應用來自匯入樣式表的模板規則 | 指令 |
| apply-templates | 將模板規則應用於當前元素或當前元素的子節點 | 指令 |
| 屬性 | 新增一個屬性 | 指令 |
| attribute-set | 定義一個命名的屬性集 | top-level-element |
| call-template | 呼叫一個命名的模板 | 指令 |
| choose | 與<when>和<otherwise>結合使用, 表達多個條件測試 |
指令 |
| comment | 在結果樹中建立註釋節點 | 指令 |
| copy | 建立當前節點的副本 (不包括子節點和屬性) |
指令 |
| copy-of | 建立當前節點的副本 (包括子節點和屬性) |
指令 |
| decimal-format | 使用format-number()函式定義將數字轉換為字串時使用的字元和符號 | top-level-element |
| element | 在輸出文件中建立元素節點 | 指令 |
| fallback | 如果處理器不支援 XSLT 元素,則指定一個備用程式碼以執行 | 指令 |
| for-each | 迴圈遍歷指定節點集中的每個節點 | 指令 |
| if | 包含一個模板,該模板僅在滿足指定條件時才會應用 | 指令 |
| import | 將一個樣式表的內容匯入另一個樣式表。 注意:匯入的樣式表優先順序低於匯入的樣式表 |
top-level-element |
| include | 將一個樣式表的內容包含到另一個樣式表中。 注意:包含的樣式表與包含的樣式表具有相同的優先順序 |
top-level-element |
| key | 宣告一個命名的鍵,該鍵可以在樣式表中使用 key() 函式使用 | top-level-element |
| message | 將訊息寫入輸出(用於報告錯誤) | 指令 |
| namespace-alias | 將樣式表中的名稱空間替換為輸出中的不同名稱空間 | top-level-element |
| number | 確定當前節點的整數位置並格式化數字 | 指令 |
| otherwise | 為<choose>元素指定預設操作 | 指令 |
| output | 定義輸出文件的格式 | top-level-element |
| param | 宣告一個本地或全域性引數 | top-level-element |
| preserve-space | 定義應保留空格的元素 | top-level-element |
| processing-instruction | 將處理指令寫入輸出 | 指令 |
| sort | 對輸出進行排序 | 指令 |
| strip-space | 定義應刪除空格的元素 | top-level-element |
| stylesheet | 定義樣式表的根元素 | top-level-element |
| template | 匹配指定節點時應用的規則 | top-level-element |
| 文字 | 將文字文字寫入輸出 | 指令 |
| transform | 定義樣式表的根元素 | top-level-element |
| value-of | 提取選定節點的值 | 指令 |
| variable | 宣告一個本地或全域性變數 | 頂級元素或指令 |
| when | 為<choose>元素指定操作 | 指令 |
| with-param | 定義要傳遞到模板的引數值 | 指令 |
圖 37: XSLT 函式 (來自 https://w3schools.tw/xsl/xsl_functions.asp)
| 名稱 | 描述 |
| current() | 返回當前節點 |
| document() | 用於訪問外部 XML 文件中的節點 |
| element-available() | 測試 XSLT 處理器是否支援指定的元素 |
| format-number() | 將數字轉換為字串 |
| function-available() | 測試 XSLT 處理器是否支援指定的元素 |
| generate-id() | 返回一個唯一標識指定節點的字串值 |
| key() | 使用<xsl:key>元素指定的索引返回節點集 |
| system-property | 返回系統屬性的值 |
| unparsed-entity-uri() | 返回未解析實體的 URI |
圖 38: 繼承的 XPath 函式 (來自 https://w3schools.tw/xsl/xsl_functions.asp)
節點集函式
| 名稱 | 描述 | 語法 |
| count() | 返回節點集中的節點數量 | number=count(node-set) |
| id() | 根據其唯一 ID 選擇元素 | node-set=id(value) |
| last() | 返回處理的節點列表中最後一個節點的位置編號 | number=last() |
| local-name() | 返回節點的本地部分。節點通常由字首、冒號和本地名稱組成 | string=local-name(node) |
| name() | 返回節點的名稱 | string=name(node) |
| namespace-uri() | 返回指定節點的名稱空間 URI | uri=namespace-uri(node) |
| position() | 返回當前正在處理的節點在節點列表中的位置 | number=position() |
字串函式
| 名稱 | 描述 | 語法和示例 |
| Concat() | 返回所有引數的串聯 | string=concat(val1, val2, ..) 示例 |
| contains() | 如果第二個字串包含在第一個字串中,則返回 true 字串,否則返回 false |
bool=contains(val,substr) 示例: |
| normalize-space() | 刪除字串開頭和結尾的空格 | string=normalize-space(string) 示例: |
| starts-with() | 如果第一個字串以第二個字串開頭,則返回 true, 否則返回 false |
bool=starts-with(string,substr) 示例 |
| string() | 將值引數轉換為字串 | string(value) 示例 |
| string-length() | 返回字串中的字元數 | number=string-length(string) 示例 |
| substring() | 返回字串引數中字串的一部分 | string=substring(string,start,length) 示例 |
| substring-after() | 返回字串引數中出現在 substr 引數中的子字串之後的字串部分 | string=substring-after(string,substr) 示例 |
| substring-before() | 返回字串引數中出現在 substr 引數中的子字串之前的字串部分 字串 |
string=substring-before(string,substr) 示例 |
| translate() | 獲取值引數,將所有出現的 string1 替換為 string2,並返回修改後的字串 |
string=translate(value,string1,string2) 示例 |
數字函式
| 名稱 | 描述 | 語法和示例 |
| ceiling() | 返回不小於數字引數的最小整數 | number=ceiling(number) 示例 |
| floor() | 返回不大於數字的最小整數 引數 |
number=floor(number) 示例 |
| number() | 將值引數轉換為數字 | number=number(value) 示例 |
| round() | 將數字引數舍入到最接近的整數 | integer=round(number) 示例 |
| sum() | 返回節點集中一組數字值的總值 | number=sum(nodeset) 示例 |
布林函式
| 名稱 | 描述 | 語法和示例 |
| boolean() | 將值引數轉換為布林值,並返回 true 或 false | bool=boolean(value) |
| false() | 返回 false | false() 示例 |
| lang() | 如果語言引數與 xsl:lang 元素的語言匹配,則返回 true,否則返回 false | bool=lang(language) |
| not() | 如果條件引數為 false,則返回 true,如果條件引數為 true,則返回 false | bool=not(condition) 示例 |
| true() | 返回 true | true() 示例 |
練習
[edit | edit source]為了更多地瞭解 XSL 和樣式表,練習 被提供。
答案
[edit | edit source]為了更多地瞭解 XSL 和樣式表,答案 被提供。