亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

用xslt將xml解析成xhtml的代碼

2024-09-05 20:55:01
字體:
來源:轉載
供稿:網友
使用xslt進行解析的基本格式是這樣的:如
復制代碼 代碼如下:www.49028c.com

<?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文件是這樣的:
復制代碼 代碼如下:www.49028c.com

<?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文件的代碼:
復制代碼 代碼如下:www.49028c.com

<?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,從而實現了隔行換色的效果,具體代碼如下:
復制代碼 代碼如下:www.49028c.com

<?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>

三、符號轉義以及CDATA語法:
目前碰到的只有“<”和“>” 要轉義成<和>如果在表達式里出現這兩個符號,頁面在預覽的時候就會報錯;
另外我們需要將原文件的內容原封不動的輸出來,包括換行或上面的大于和小于號等頁面元素,這時候就需要CDATA這個標簽, CDATA全稱character data,翻譯為字符數據,數據不進行轉義直接輸出。語法格式如下:
<![CDATA[這里放置需要顯示的字符]]>
例如:
<![CDATA[<person name="ason"></person>]]>
在頁面上顯示的內容將是"<person name="ason"></person>";
四、幾個教程中并沒有提到的名詞:
1、local-name();例子:<xsl:value-of select="local-name()"/>,這里所表達的意思就是當前節點的名字。
2、<xsl:call-template name="" mode="">...</xsl:call-template>,call-template和apply-template的區別,簡單說apply是應用,call是調用。
用apply時,引擎自動搜索與當前select指定xpath的匹配節點相匹配的template(該template必須有屬性match)并使用該template進行處理,此時需要指定的是select的path。
用call時就跟其它語言調用函數一樣,必須指定name屬性,相應的,該template必須有name屬性,當然,也可以在這時with-param(當然相應的模板中有對應的param才行,不過這個不強制要求)。通過設置mode屬性可以調用同一內容的不同表現形式,這個由自己去定義。
3、count(ancestor::*)這種寫法是計算當前節點有多少個祖先節點,當然 ancestor也可以用child,following-sibling等xpath關系。
五、對于要符合多條件的判斷,xslt不能很好的支持:
以家族樹為例,我要取一個位于第二層的,名字叫Lichao的人,如果按字面理解我們可以寫成<xsl:when test="count(ancestor::*) =2 && *[@name] = 'Lichao'">...</xsl:when>,但是這樣寫在預覽xml的時候就會報錯,我也想用條件里面套條件這樣的寫法,也不符合語法,查了很多相關的資料,沒有找到很好的解決辦法。
以上是在學習和使用xslt對xml進行解析的過程中的一些感想和記錄,xslt很強大,有很多功能都沒有涉及,當然,我還要繼續學習和研究。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人亚洲成人日韩成人| 国产精品日韩欧美综合| 日本精品久久中文字幕佐佐木| 亚洲国产精品久久精品怡红院| 国产精品999| 精品久久久精品| 日韩av色综合| 俺去了亚洲欧美日韩| 国产成人精品999| 欧美成人中文字幕在线| 亚洲乱亚洲乱妇无码| 精品国产福利视频| 4388成人网| 亚洲成人av片| 国产97在线观看| 久久久精品亚洲| 91爱视频在线| 97在线视频免费| 不卡av在线网站| 国产精品久久久av| 91九色视频在线| 亚洲精品久久久久久久久久久久| 成人激情免费在线| 亚洲一区亚洲二区亚洲三区| 国产免费观看久久黄| 精品色蜜蜜精品视频在线观看| 96pao国产成视频永久免费| 神马久久久久久| 福利一区视频在线观看| 国产精品自产拍在线观看| 精品久久久久久久中文字幕| 欧美在线精品免播放器视频| 久久久久久久久久久成人| 亚洲欧洲视频在线| 91免费在线视频| 亚洲精品欧美一区二区三区| 亚洲欧洲国产精品| 成人免费看吃奶视频网站| 日韩中文在线中文网三级| 日韩av手机在线观看| 亚洲精品日韩激情在线电影| 亚洲成年网站在线观看| 国产精品成久久久久三级| 亚洲欧美国产精品| 国产视频精品xxxx| 国产色视频一区| 欧美精品999| 久久精品视频在线| 欧美中文在线字幕| 日韩av手机在线观看| 国产精品一区二区av影院萌芽| 国产女人18毛片水18精品| 777精品视频| 2020久久国产精品| 美日韩精品免费观看视频| 一本一本久久a久久精品牛牛影视| 色偷偷偷综合中文字幕;dd| 国产一区二中文字幕在线看| 日本亚洲欧洲色| 亚洲香蕉伊综合在人在线视看| 国产盗摄xxxx视频xxx69| 亚洲精品av在线播放| 久久亚洲电影天堂| 日韩有码在线视频| 久久久999国产精品| 亚洲女同精品视频| 中文字幕成人精品久久不卡| 亚洲精品97久久| 国产午夜精品久久久| 黄色成人在线播放| 亚洲精品小视频在线观看| 国语自产偷拍精品视频偷| 欧美中文字幕视频| 午夜精品一区二区三区视频免费看| 亚洲色图欧美制服丝袜另类第一页| 日韩精品在线视频观看| 国产97在线亚洲| 久久久久久久成人| 国产精品久久久久aaaa九色| 91在线高清免费观看| 亚洲国产精品久久久久秋霞不卡| 亚洲欧美日本另类| 国产精品精品一区二区三区午夜版| 成人黄色片在线| 亚洲天堂影视av| 国产va免费精品高清在线| 午夜精品理论片| 97精品免费视频| 另类图片亚洲另类| 国产伦精品一区二区三区精品视频| 国产精品青青在线观看爽香蕉| 日韩久久免费视频| 国产一区二区在线播放| 在线观看欧美日韩国产| 亚洲国产另类 国产精品国产免费| 777777777亚洲妇女| 亚洲а∨天堂久久精品9966| 国产精品久久久久久久久久尿| 亚洲女人初尝黑人巨大| 亚洲美女黄色片| 在线成人一区二区| 欧美日韩中文字幕在线| 国产91精品视频在线观看| 国产精品久久久久91| 欧美激情欧美激情| 国产成人久久精品| 欧美成人亚洲成人日韩成人| 亚洲第一男人天堂| 久久天天躁夜夜躁狠狠躁2022| 91精品久久久久久久久久另类| 一区二区三区在线播放欧美| 日韩av在线免费| 91豆花精品一区| 亚洲色图50p| 欧美中文字幕第一页| 日韩亚洲精品视频| 亚洲国产又黄又爽女人高潮的| 亚洲美女精品久久| 亚洲一区二区精品| 亚洲天堂av在线免费观看| 日韩中文av在线| 亚洲自拍欧美另类| 亚洲激情小视频| 777精品视频| 在线午夜精品自拍| 亚洲91精品在线| 国产成人精品视频在线| 91亚洲精品久久久| 欧美亚洲一级片| 国产精品日韩专区| 欧美日韩性视频| 欧美日韩成人在线视频| 亚洲国产精品视频在线观看| 国自在线精品视频| 裸体女人亚洲精品一区| 蜜臀久久99精品久久久久久宅男| 欧美国产日韩xxxxx| 亚洲精品在线观看www| 欧美与欧洲交xxxx免费观看| 黑丝美女久久久| 国产精品视频一区二区三区四| 欧美精品在线第一页| 亚洲人成欧美中文字幕| 欧美日韩在线一区| 亚洲资源在线看| 国产精品久久久久久网站| 国产精品亚洲综合天堂夜夜| 欧美野外wwwxxx| 国产欧美精品久久久| 成人信息集中地欧美| 国内精品久久久久伊人av| 日本精品免费一区二区三区| 亚洲欧美一区二区三区在线| 久久在线视频在线| 国产成人亚洲综合91精品| 91久久在线视频| 91欧美精品午夜性色福利在线| 国产精品美女www爽爽爽视频| 欧美成人一区二区三区电影| 97色在线观看| 亚洲日本中文字幕免费在线不卡| 久久精品国产久精国产一老狼| 国产主播在线一区| 国产精品美女主播|