xslt進行解析的基本格式如下所示的程式碼,需要的朋友可以參考下
使用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.php.cn/這個網站中找到相關內容的教學。那樣,xslt以xml的版本作為開始,用9b3f5112742f005cec06e47ea4b12711...d56e9a6b61cad852bfc1882295a848f9的格式進行轉換。它了解並不是很透徹,下面只是羅列一些我在學習和使用它的時候碰到的一些要點;
一、遞歸以及傳參數方法:
以一顆家族樹例子,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(43243beb2fcda3ec2ce639590e7c2e59...e94ab143aef4805f201a19ba8e8a2d4a)新增範本的時候給參數賦值,
ca90d88675738db87d7b04a71bd97b48 2f93d5c7e50a96a95fad97ec4b37ec6d ff93f53840efed4c90b2bec5eafab21d ,參數level的值一開始賦值為“0”,而我們用參數level的值($level)來作縮進的值,如text-indent:{$level}em,所以渲染xml內容的時候,第一層沒有縮進,渲染完第一層後,我們經過
ca90d88675738db87d7b04a71bd97b48
b4a2b9e7952364cdfdd9130f70f2f778
ff93f53840efed4c90b2bec5eafab21d
這樣的方法將參數level的值進行了累加從而實現了遞歸,這樣每渲染一層,參數值就加上2,從而實現了不同層次的縮進來實現家族樹的結構;這裡還要說一下,我們透過@+屬性如@name來取節點屬性的值。
二、用參數實現隔行換色:
還是引用上面的例子,以及參數level,我們在遞歸的時候給參數+1(奇數)而不是+2 (偶數) ,透過(.. test="$level mod 2 = 0")或(.. test="$level mod 2 = 1")就可以實現選取奇數行還是偶數行,我們用3e08d16b69ca6dceb52122b5e3e896ec < ;xsl:when test="$level mod 2 = 0">...c078c4fd130ec324d38bc095c4eaeb79 b490e3a477a758f8d417150b585fd42a...d5d6e75bd640df627ff3451c7e49476a 0deb431ca822a5ae1672ac1bd025a592給奇數行和偶數行不同的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语法:
目前碰到的只有“e84aacd5f768f485facc4bd6b8750f46” 要转义成67bffed8d39c986beaddeed3e8cd5568如果在表达式里出现这两个符号,页面在预览的时候就会报错;
另外我们需要将原文件的内容原封不动的输出来,包括换行或上面的大于和小于号等页面元素,这时候就需要CDATA这个标签, CDATA全称character data,翻译为字符数据,数据不进行转义直接输出。语法格式如下:
37257cd4c239f5a1e042c3f605185721
例如:
db42c9d5aa7564004c0daff71411f68acb884f44f2f1937276917c04c3676183]]>
在页面上显示的内容将是"aac23f448b702b8b93a75e0945ea2f62cb884f44f2f1937276917c04c3676183";
四、几个教程中并没有提到的名词:
1、local-name();例子:00361f9c2ab69ee1cbfeb1ba4da20b50,这里所表达的意思就是当前节点的名字。
2、f3619dc8969622cfe315844131c7ff3b...dc728c903cc44e1b1becadaa331990fe,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的人,如果按字面理解我们可以写成361bc00243761ed36605043ffdd1ba40...c078c4fd130ec324d38bc095c4eaeb79,但是这样写在预览xml的时候就会报错,我也想用条件里面套条件这样的写法,也不符合语法,查了很多相关的资料,没有找到很好的解决办法。
以上是在学习和使用xslt对xml进行解析的过程中的一些感想和记录,xslt很强大,有很多功能都没有涉及,当然,我还要继续学习和研究。
以上是利用xslt將xml解析成xhtml的程式碼範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!