XSLT的元素語法

3.XSLT的元素語法
  
  
  
  
  3.1 xsl:template和xsl:apply-templates
  
  
  3.2 xsl:value-of
  
  
  3.3 xsl:for-each
  
  
  3.4 xsl:if
  
  
  3.5 Xxsl:choose, when, otherwise
  
  
  3.6 xsl:sort
  
  
  
  
  3.1 xsl:template和xsl:apply-templates
  
  模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一個一個的模板組成,任何一個XSLT文件至少包含一個模板。模板的概念就象是搭積木;你如果是程序員,也可以將模板看作一個方法,一個類,或者一個模塊。它們可以被拼裝組合,也可以單獨成塊,不同的模板控制不同的輸出格式。
  模板(template)由兩部分組成:匹配模式(match pattern)和執行。簡單的講模式定義XML源文檔中哪一個節點將被模板處理,執行則定義輸出的是什麼格式。兩部分對應的語法爲xsl:template和xsl:apply-templates。
  
  xsl:template的語法是:
  
  <xsl:template
  match = pattern
  name = qname
  priority = number
  mode = qname>
  <!-- 執行內容 -->
  </xsl:template>
  
  xsl:template的作用是定義一個新模板。屬性中name,priority,和mode用來區別匹配同一節點的不同模板。它們不是常用的屬性。match屬性則控制模板的匹配模式(pattern),匹配模式是用來定位XML源文檔中哪一個節點被模板處理。一個模板匹配一個節點。我們用一個例子來幫助理解:
  假設我們要處理一個包含章節和段落文檔。我們用para元素定義段落,用chapter元素定義章節。我們來看看match屬性可能的值。下面的語句寫法說明模板匹配所有的para元素
  
  <xsl:template match="para">
  </xsl:template>
  
  下面的語句寫法說明模板匹配所有的para元素和所有的chapter元素:
  
  <xsl:template match="(chapter|para)">
  </xsl:template>
  
  下面的語句寫法說明模板匹配所有的父節點爲chapter元素的para元素:
  
  <xsl:template match="chapter//para">
  </xsl:template>
  
  下面的語句寫法說明模板匹配根節點:
  
  <xsl:template match="/">
  </xsl:template>
  
  我們再來看apply-templates語法:
  
  <xsl:apply-templates
  select = node set-expression
  mode = qname>
  </xsl:apply-templates>
  
  xsl:apply-templates用來執行那一個節點被模板具體處理。你可以將它理解爲程序中調用子函數。select屬性用來定義確切的節點名稱。xsl:apply-templates總是包含在xsl:template元素中,象這樣:
  
  <xsl:template match="/">
  <xsl:apply-templates select="para"/>
  </xsl:template>
  
  這段代碼說明摸板匹配整個文檔(根節點),具體執行時處理根節點下所有para元素。
  
  <xsl:template match="para">
  <p><xsl:apply-templates/></p>
  </xsl:template>
  
  而這一段代碼則表示摸板匹配para節點,所有para下的子元素都將被處理。
  
  3.2 xsl:value-of
  
  XSL:value-of用來將源文檔中元素的文本值寫到輸出文檔中。例如:
  有一個個人資料的XML文檔:
  
  <?xml version="1.0" encoding="iso-8859-1"?>
  <PERSON>
  <name>ajie</name>
  <age>28</age>
  </PERSON>
  
  我如果想在輸出文檔中顯示上面這個XML源文檔中的name元素的值,可以這樣寫XSLT代碼:
  
  <xsl:template match="PERSON">
  <xsl:value-of select="name"/>
  </xsl:template>
  
  執行後,你會看到"ajie"被單獨顯示出來。其中match="PERSON"定義摸板匹配PERSON節點,xsl:value-of 語法說明需要輸出一個節點的值,而select="name"則定義需要被輸出的元素爲name。看這個過程是不是和數據庫裏查詢一個人的名字很象?當然,xsl:value-of查詢還有更多,更復雜的語法,因爲是涉及尋找和定位的功能,我們會放在後面的XPath語法中在仔細講解。
  同樣功能的還有xsl:copy-of,用法一樣,就不重複解釋了。
  
  3.3 xsl:for-each
  
  xsl:for-each語法允許你循環處理被選擇的節點。例如:有一個含多個個人資料的XML文檔:
  
  <?xml version="1.0" encoding="iso-8859-1"?>
  <PEOPLE>
  <PERSON>
  <name>ajie</name>
  <age>28</age>
  </PERSON>
  <PERSON>
  <name>tom</name>
  <age>24</age>
  </PERSON>
  <PERSON>
  <name>miake</name>
  <age>30</age>
  </PERSON>
  </PEOPLE>
  
  我需要顯示所有人的姓名,則可以將XSLT代碼寫成:
  
  <xsl:template match="PEOPLE">
  <xsl:for-each select="child::PERSON">
  <xsl:value-of select="name"/>
  </ xsl:for-each>
  </xsl:template>
  
  3.4 xsl:if
  
  xsl:if類似普通程序語言的if條件語句,允許設定節點滿足某個條件時,被模板處理。xsl:if的語法格式爲:
  
  <xsl:if test=布爾表達式>
  template body
  </xsl:if>
  
  例如:
  
  <xsl:template match="PEOPLE">
  <xsl:if test="@name">
  <p><xsl:value-of select="@name"/></p>
  </xsl:if>
  </xsl:template>
  
  這段代碼的意思是檢測PEOPLE節點下所有的元素,如果發現有<name>元素,則將<name>元素的值輸出。其中@符號是統配符,表示節點下所有的元素。
  
  3.5 xsl:choose, xsl:when 和 xsl:otherwise
  
  xsl:if語法沒有else的屬性。如果我們要進行多項選擇,那麼就要使用xsl:choose / xsl:when / xsl:otherwise系列流程控制語法了。具體的使用請看下面的XSL文件例子:
  
  <xsl:template match="PEOPLE">
  <xsl:choose>
  <xsl:when test="@name = 'ajie'">
  <B><xsl:value-of select="@name"/></B>
  </xsl:when>
  <xsl:when test="@name">
  <I><xsl:value-of select="@name"/></I>
  </xsl:when>
  <xsl:otherwise>
  No name available
  </xsl:otherwise>
  <xsl:choose>
  </xsl:template>
  
  說明:首先在PEOPLE節點下尋找<name>屬性值爲ajie的元素,如果找到,將ajie用粗體輸出;如果沒有發現值爲ajie的<name>元素,則將所有的<name>元素的值都用斜體輸出;如果沒有發現任何<name>元素,則顯示"No name available"。
  
  3.6 xsl:sort
  
  在XSLT中可以對XML源文檔的元素進行重新排序,排序的語法就是xsl:sort。舉例:下面的代碼就是將文檔元素按name排序。
  
  <xsl:template match="PEOPLE">
  <xsl:apply-templates select="PERSON">
  <xsl:sort select="@name"/>
  </xsl:apply-templates>
  </xsl:template>
  
  以上是XSLT的元素的主要語法,還有很多其他的語法,例如:import, include, element, attribute, number, param等等語法,在這裏就不一一解釋。我們的目的是讓您對XSLT的語法有基本的概念,理解XSLT作爲一種轉換語言的強大功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章