在前面介紹的XSLT中我們看到了模板的一些用法,也知道了怎樣取出元素節點的值。比如<xsl:value-of select="."/> .表示取出當前節點的值,如果我們想取出當前節點的父節點或者當前節點父節點的父節點或者當前節點的兄弟節點的值,那怎麼辦呢?通過XPath表達式中的節點軸我們就可以辦到。
1、child軸
songs.XML文件如下:
<?XML version="1.0" encoding="gb2312"?>
<?XML-stylesheet type="text/xsl" href="songs.xslt"?>
<歌曲列表>
這個歌曲列表有兩首歌
<名稱>周懂專輯</名稱>
<!--第一首歌曲 -->
<歌曲 日期="2003-11-12">
月亮代表我的心
<名稱>夏天裡的一把雨</名稱>
<作曲家>張三</作曲家>
<長度>4:20</長度>
<藝術家>小天王</藝術家>
月亮代表你的心
</歌曲>
<!--第二首歌曲 -->
<歌曲 日期="2005-12-30">
月亮代表他的心
<名稱>冬天裡的一把雪</名稱>
<作曲家>王五</作曲家>
<作曲家>李四</作曲家>
<藝術家>周董</藝術家>
月亮代表她的心
</歌曲>
</歌曲列表>
songs.xslt文件如下:
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/歌曲列表">
<Html>
<head><title>練習使用child軸</title></head>
<body>
<xsl:apply-templates select="歌曲"/>
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲">
<xsl:apply-templates select=" "/><br/>
</xsl:template>
</xsl:stylesheet>
child::名稱 上下文節點的名稱子節點
child::* 上下文節點的所有元素子節點
child::text() 上下文節點的所有文本子節點
child::node() 上下文節點的所有子節點
child::comment() 上下文節點的所有注釋子節點
child::processing-instruction() 上下文節點的所有處理指令子節點
注:以上六行中的上下文節點指歌曲節點。child::也可以省略。
2、descendant軸
songs.xslt文件如下:<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Html>
<head><title>練習使用child軸</title></head>
<body>
<xsl:apply-templates/>
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲列表">
<xsl:apply-templates select="descendant::名稱"/>
</xsl:template>
<xsl:template match="名稱">
<xsl:value-of select="."/><br/>
</xsl:template>
</xsl:stylesheet>
descendant::名稱,表示繼續處理上下文節點(歌曲列表節點)的名稱子節點、上下文節點的子節點的名稱子節點,上下文節點的子節點的子節點的名稱子節點,一直到最後,以上環境的結果如下圖:
再次修改songs.xslt文件如下:
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Html>
<head><title>練習使用child軸</title></head>
<body>
<xsl:apply-templates select="歌曲列表"/>
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲列表">
<xsl:apply-templates select="descendant::*"/>
</xsl:template>
<xsl:template match="*">
元素節點開始:<xsl:value-of select="."/>:元素節點結束<br/>
</xsl:template>
</xsl:stylesheet>
descendant::*,表示繼續處理上下文節點(歌曲列表節點)的所有子節點、上下文節點的子節點的所有子節點,上下文節點的子節點的子節點的所有子節點,一直到最後,以上環境的結果如下圖:
再次修改songs.xslt文件如下:
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Html>
<head><title>練習使用child軸</title></head>
<body>
<xsl:apply-templates select="歌曲列表"/>
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲列表">
<xsl:apply-templates select="descendant::text()"/>
</xsl:template>
<xsl:template match="text()">
文本節點開始:<xsl:value-of select="."/>:文本節點結束<br/>
</xsl:template>
</xsl:stylesheet>
descendant::text(),表示繼續處理上下文節點(歌曲列表節點)的所有文本子節點、上下文節點的子節點的所有文本子節點,上下文節點的子節點的子節點的所有文本子節點,一直到最後,以上環境的結果如下圖:
再次修改songs.xslt文件如下:
<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Html>
<head><title>練習使用child軸</title></head>
<body>
<xsl:apply-templates select="歌曲列表"/>
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲列表">
<xsl:apply-templates select="descendant::node()"/>
</xsl:template>
<xsl:template match="text()">
文本節點開始:<xsl:value-of select="."/>:文本節點結束<br/>
</xsl:template>
<xsl:template match="*">
元素節點開始:<xsl:value-of select="."/>:元素節點結束<br/>
</xsl:template>
</xsl:stylesheet>
descendant::node(),表示繼續處理上下文節點(歌曲列表節點)的所有子節點、上下文節點的子節點的所有子節點,上下文節點的子節點的子節點的所有文本子節點,一直到最後,以上環境的結果如下圖:
通過上面的介紹,descendant::comment() descendant::processing-instruction()應該不難理解。
3、descendant-or-self軸
descendant-or-self軸表示descendant軸的內容和上下文節點本身。
4、ancestor軸
ancestor::*表示上下文節點的父元素節點、上下文節點父元素節點的父元素節點、一直類推到跟元素節點。
songs.xslt文件如下:<?XML version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" XMLns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Html>
<head><title>練習使用attribute軸</title></head>
<body>
<xsl:apply-templates />
</body>
</Html>
</xsl:template>
<xsl:template match="歌曲列表">
<xsl:apply-templates select="歌曲"/><br/>
</xsl:template>
<xsl:template match="歌曲">
<xsl:apply-templates select="名稱"/><br/>
</xsl:template>
<xsl:template match="名稱">
<xsl:for-each select="ancestor::*">
<xsl:value-of select="."/><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
結果如下圖:
注意:在上面輸出節點值時,因為是多個節點,所以用for-each循環,否則只會輸出根元素節點的值。
5、ancestor-or-selft軸
ancestor-or-selft軸除了表示ancestor軸的內容外,還包含上下文節點本身。