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

首頁 > 開發 > XML > 正文

用xslt將xml解析成xhtml的代碼

2024-09-05 20:53:45
字體:
來源:轉載
供稿:網友
使用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>

三、符號轉義以及CDATA語法:
目前碰到的只有“<”和“>” 要轉義成&lt;和&gt;如果在表達式里出現這兩個符號,頁面在預覽的時候就會報錯;
另外我們需要將原文件的內容原封不動的輸出來,包括換行或上面的大于和小于號等頁面元素,這時候就需要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
中文字幕亚洲一区在线观看| 国产日韩综合一区二区性色av| 国产区精品在线观看| 久久久成人的性感天堂| 国产精品99久久久久久www| 欧美性猛交xxxx免费看漫画| 欧美成人精品h版在线观看| 一区二区在线免费视频| 91久久中文字幕| 久久精品电影网站| 成人免费在线视频网站| 欧美高清理论片| 久久久91精品| 国产欧美va欧美va香蕉在线| 国产国语videosex另类| xvideos成人免费中文版| 亚洲精品福利在线观看| www欧美日韩| 欧美激情第99页| 亚洲专区国产精品| 成人字幕网zmw| 538国产精品视频一区二区| 91精品国产综合久久男男| 国产精品久久久久久久久久久久久久| 国产精品国产三级国产aⅴ9色| 最新69国产成人精品视频免费| 日韩电影在线观看永久视频免费网站| 精品久久久久久久久久久久久久| 亚洲一区二区三区毛片| 亚洲性69xxxbbb| 亚洲午夜未满十八勿入免费观看全集| 亚洲一区二区三区成人在线视频精品| 韩国国内大量揄拍精品视频| 国产亚洲人成网站在线观看| 清纯唯美亚洲激情| 久久九九亚洲综合| 欧美精品一区三区| 精品亚洲aⅴ在线观看| 色悠悠久久久久| 欧美精品xxx| 国产午夜精品一区理论片飘花| 亚洲精品在线看| 久久精品国产欧美亚洲人人爽| 国产香蕉97碰碰久久人人| 日韩精品免费在线视频| 色综合久久88色综合天天看泰| 欧美视频13p| 久久精品成人欧美大片古装| 欧美性猛交xxxx黑人猛交| 91影院在线免费观看视频| 欧美最猛性xxxxx(亚洲精品)| 日本sm极度另类视频| 成人黄色在线观看| 亚洲国产精品专区久久| 国产v综合v亚洲欧美久久| 欧美性xxxxxxxxx| 色樱桃影院亚洲精品影院| 日韩欧美亚洲成人| 精品欧美国产一区二区三区| 国产91免费观看| 欧美激情第一页xxx| 欧美香蕉大胸在线视频观看| 精品久久久一区二区| 欧美一乱一性一交一视频| 精品久久久久久久久久久久久久| 久久国内精品一国内精品| 国产欧美va欧美va香蕉在线| 尤物精品国产第一福利三区| 亚洲精品国产品国语在线| 亚洲一区二区免费在线| 丁香五六月婷婷久久激情| 亚洲国产天堂网精品网站| 欧美人与性动交a欧美精品| 欧美韩日一区二区| 日韩动漫免费观看电视剧高清| 国产精品主播视频| 国产精品永久免费在线| 欧美成在线视频| 亚洲国产精品系列| 欧美剧在线观看| 亚洲成人三级在线| 国产精品av在线播放| 91在线观看免费网站| 精品国产一区av| 精品小视频在线| 亚洲性线免费观看视频成熟| 国产成人在线播放| 日韩国产欧美精品一区二区三区| 亚洲精品一区中文字幕乱码| 91九色视频导航| 国产精品夫妻激情| 在线播放国产一区中文字幕剧情欧美| 亚洲国产成人91精品| 国产亚洲欧洲黄色| 亚洲欧美在线第一页| 亚洲国产精品人久久电影| 国产精品成人在线| 91av在线影院| 国产精品www| 亚洲视频精品在线| 亚洲第一精品自拍| 日韩电影免费观看在线| 日日狠狠久久偷偷四色综合免费| 亚洲最大的成人网| 成人精品久久av网站| 成人精品视频久久久久| 在线视频欧美日韩| 国产精品视频自在线| 91sao在线观看国产| 欧美精品一区三区| 日韩网站免费观看高清| 最近2019年手机中文字幕| 日韩精品在线电影| 国模视频一区二区| 国产在线久久久| 亚州av一区二区| 亚洲第一天堂无码专区| 亚洲成人精品视频在线观看| 久久久久久国产免费| 97视频在线观看播放| 亚洲第一网中文字幕| 在线观看国产精品淫| 日韩精品视频在线观看网址| 亚洲精品www久久久久久广东| 热久久免费国产视频| 日韩在线一区二区三区免费视频| 亚洲美女av网站| 色爱av美腿丝袜综合粉嫩av| 日韩久久精品电影| 国产欧美日韩免费看aⅴ视频| 777午夜精品福利在线观看| 亚洲一区二区久久久久久久| 国产精品国语对白| 国产成+人+综合+亚洲欧美丁香花| 97视频免费看| 国产精品激情av电影在线观看| 日韩一级裸体免费视频| 国产一区二区视频在线观看| 久久在线免费视频| 狠狠操狠狠色综合网| 红桃视频成人在线观看| 91免费人成网站在线观看18| yellow中文字幕久久| 亚洲深夜福利在线| 2019中文字幕在线| 亚洲欧美中文字幕在线一区| 欧美午夜美女看片| 亚洲第一免费播放区| 久久精品美女视频网站| 亚洲精品不卡在线| 亚洲va欧美va国产综合剧情| 国产成人中文字幕| 亚洲欧美中文在线视频| 亚洲电影免费在线观看| 欧美大学生性色视频| 久久99国产精品久久久久久久久| 欧美一区二区色| 成人免费xxxxx在线观看| 日韩av电影手机在线观看| 国产精品视频99| 亚洲欧美日韩精品久久奇米色影视| 日韩精品亚洲元码| 午夜精品一区二区三区在线视| 中国china体内裑精亚洲片|