使用xslt將xml解析成xhtml

 

使用xslt進行解析的基本格式是這樣的:如

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>

<xsl:template match="/">
<html>
<body>
//這裏可以包含一些xhtml的標籤
</body>
</html>
</xsl:template>
</xsl:stylesheet>

XSL 指擴展樣式表語言(EXtensible Stylesheet Language),xsl是xml的樣式表,xsl 包括3部分,分別是:xslt(一種用於轉換 XML 文檔的語言)、x-path(一種用於在 XML 文檔中導航的語言)、xsl-fo(一種用於格式化 XML 文檔的語言),可以在http://www.w3cschool.cn/這個網站中找到相關內容的教程。

像前面代碼描述的那樣,xslt以xml的版本作爲開始,用<xsl:style-sheeet ...>...</xsl:style-sheeet>的格式進行轉換。由於是初次接觸xslt,對它瞭解並不是很透徹,下面只是羅列一些我在學習和使用它的時候碰到的一些要點;

一、遞歸以及傳參數方法:

以一顆家族樹爲例子,xml文件是這樣的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="digui.xsl"?>
<person name="Otto" sex="mael" age="60">
  <person name="Sandra" sex="mael" age="35">
  <person name="Lichao" sex="femael" age="34">
   <person name="Zhangsan" sex="mael" age="12"/>
  </person>
  <person name="Eric" sex="femael" age="36">
   <person name="HaLi" sex="mael" age="18"/>
  </person>
  <person name="Lisi" sex="mael" age="30">
   <person name="HeLi" sex="mael" age="6"/>
   <person name="Andy" sex="femael" age="13"/>
  </person>
  </person>
</person>
現在要寫一個xslt把家族的關係給表達出來,其實家族的關係就是一顆家族樹,所以我們通過輸出不同層次的縮進來表達這樣的關係,最大的祖宗,然後按輩份分別進行縮進,最小輩份的排在最後面,縮進最多,這樣一顆樹的層次就出來了;下面是xsl文件的代碼:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>

<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="'0'"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>

<xsl:template match="person">
<xsl:param name="level"/>
<p style="text-indent:{$level}em">name:<xsl:value-of select="@name"/>,sex:<xsl:value-of select="@sex"/>,age:<xsl:value-of select="@age"/></p>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 2"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
在這裏我們先在模板中定義了一個叫level的參數,用<xsl:param name="level"/>這樣的語法,然後在主template(<xsl:template match="/">...</xsl:template>)添加模板的時候給參數賦值,

<xsl:apply-templates select="person"> <xsl:with-param name="level" select="'0'"/> </xsl:apply-templates>,參數level的值一開始賦值爲“0”,而我們用參數level的值($level)來作縮進的值,如text-indent:{$level}em,所以渲染xml內容的時候,第一層沒有縮進,渲染完第一層後,我們通過

<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 2"/>
</xsl:apply-templates>

這樣的方法將參數level的值進行了累加從而實現了遞歸,這樣每渲染一層,參數值就加上2,從而實現了不同層次的縮進來實現家族樹的結構;這裏還要說一下,我們通過@+屬性如@name來取節點屬性的值。

二、用參數實現隔行換色:

還是引用上面的例子,以及參數level,我們在遞歸的時候給參數+1(奇數)而不是+2 (偶數),通過(.. test="$level mod 2 = 0")或(.. test="$level mod 2 = 1")就可以實現選取奇數行還是偶數行,我們用<xsl:choose> <xsl:when test="$level mod 2 = 0">...</xsl:when> <xsl:otherwise>...</xsl:otherwise> </xsl:choose>給奇數行和偶數行不同的background-color,從而實現了隔行換色的效果,具體代碼如下:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='GB2312' indent='yes'/>

<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="'0'"/>
</xsl:apply-templates>
</body>
</html>
</xsl:template>

<xsl:template match="person">
<xsl:param name="level"/>
<xsl:choose>
<xsl:when test="$level mod 2 = 0">
<p style="text-indent:{$level}em;background-color:#DDD">name:<xsl:value-of select="@name"/>,sex:<xsl:value-of select="@sex"/>,age:<xsl:value-of select="@age"/></p>
</xsl:when>
<xsl:otherwise>
<p style="text-indent:{$level}em;background-color:#EEE">name:<xsl:value-of select="@name"/>,sex:<xsl:value-of select="@sex"/>,age:<xsl:value-of select="@age"/></p>
</xsl:otherwise>
<xsl:apply-templates select="person">
<xsl:with-param name="level" select="$level + 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章