`

[XSL样式表]xPath学习

阅读更多

test1.xml:

<?xml version="1.0" encoding="utf-8"?>
<?xml:stylesheet type="text/xsl" href="test3.xsl"?>
<root>
<e1>
<e1-1>
<e1-1-1>
1231.23
</e1-1-1>
</e1-1>
<e1-2>
4564.56
</e1-2>
</e1>
<e2>
<e2-1>
789.789
</e2-1>
<e2-2>
<e2-2-1>
0120.12
</e2-2-1>
</e2-2>
<e2-3>
3453.45
</e2-3>
</e2>
<e3>
<e3-1>
<e3-1-1>
6.78678
</e3-1-1>
<e3-1-2>
<e3-1-2-1>
9019.01
</e3-1-2-1>
</e3-1-2>
</e3-1>
<e3-2>
<e3-2-1>
234.234
</e3-2-1>
</e3-2>
</e3>
</root>

test1.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html><body>
<xsl:apply-templates select="root/e2"/>
</body></html>
</xsl:template>
<xsl:template name="temp1" match="root/e2">
[preceding::root/e2/]
<xsl:for-each select="preceding::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[following::root/e2/]
<xsl:for-each select="following::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[preceding-sibling::root/e2/]
<xsl:for-each select="preceding-sibling::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[following-sibling::root/e2/]
<xsl:for-each select="following-sibling::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[descendant::root/e2/]
<xsl:for-each select="descendant::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[ancestor::root/e2/]
<xsl:for-each select="ancestor::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[descendant-or-self::root/e2/]
<xsl:for-each select="descendant-or-self::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[ancestor-or-self:root/e2/]
<xsl:for-each select="ancestor-or-self::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[parent::root/e2/]
<xsl:for-each select="parent::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[child::root/e2/]
<xsl:for-each select="child::node()">
[<xsl:value-of select="local-name()"/>]
</xsl:for-each>
<hr/>
[self::root/e2/]
[<xsl:value-of select="local-name(self::node())"/>]
<hr/>
</xsl:template>
</xsl:stylesheet>

结果:下图中的[]代表textNode()。因为node()方法包含所有类型的节点。因此使用该方法时应该留意对类型进行过滤。

[preceding::root/e2/] [xml:stylesheet] [e1] [e1-1] [e1-1-1] [] [e1-2] []
[following::root/e2/] [e3] [e3-1] [e3-1-1] [] [e3-1-2] [e3-1-2-1] [] [e3-2] [e3-2-1] []
[preceding-sibling::root/e2/] [e1]
[following-sibling::root/e2/] [e3]
[descendant::root/e2/] [e2-1] [] [e2-2] [e2-2-1] [] [e2-3] []
[ancestor::root/e2/] [] [root]
[descendant-or-self::root/e2/] [e2] [e2-1] [] [e2-2] [e2-2-1] [] [e2-3] []
[ancestor-or-self:root/e2/] [] [root] [e2]
[parent::root/e2/] [root]
[child::root/e2/] [e2-1] [e2-2] [e2-3]
[self::root/e2/] [e2]

test2.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html><body>
<xsl:apply-templates select="root/e2"/>
</body></html>
</xsl:template>
<xsl:template match="root/e2">
[root/e2/e2-1][ceiling(
<xsl:value-of select="child::node()[local-name()='e2-1']"/>
)=<xsl:value-of select="ceiling(child::node()[local-name()='e2-1'])"/>]
<hr/>
[root/e2/e2-2/e2-2-1][floor(
<xsl:value-of select="descendant::node()[local-name()='e2-2-1']"/>
)=<xsl:value-of select="floor(descendant::node()[local-name()='e2-2-1'])"/>]
<hr/>
[root/e1/e1-1-1 + root/e3/e3-1-1][
<xsl:value-of select="preceding::node()[local-name()='e1-1-1']"/>
+
<xsl:value-of select="following::node()[local-name()='e3-1-1']"/>
=
<xsl:value-of select="preceding::node()[local-name()='e1-1-1'] + following::node()[local-name()='e3-1-1']"/>]
<hr/>
[root/e2/e2-2/e2-2-1][round(
<xsl:value-of select="descendant::node()[local-name()='e2-2-1']"/>
)=
<xsl:value-of select="round(descendant::node()[local-name()='e2-2-1'])"/>]
<hr/>
[root/e2 counts of descendants]
[count(nodes)=
<xsl:value-of select="count(descendant::node())"/>]
[count(elements)=
<xsl:value-of select="count(descendant::node()[boolean(local-name())])"/>]
[count(texts)=
<xsl:value-of select="count(descendant::node()[boolean(text())])"/>]
<hr/>
[root/e2][number(text())=
<xsl:value-of select="number(self::node()/text())"/>]
[number(boolean(text()))=
<xsl:value-of select="number(boolean(self::node()/text()))"/>]
[number(string(text()))=
<xsl:value-of select="number(string(self::node()/text()))"/>]
<hr/>
</xsl:template>

</xsl:stylesheet>

结果:这一部分测试xPath中数值函数的运用,几点结论:

一、当任意类型之间用+相加时,相加之前元素会先转换为number类型。

二、形如0120.12这样以零开头的字串,转换成number型时不会报错。

三、可以用boolean(local-name())和boolean(text())的方式过滤节点类型。

四、对于不含textNode的元素或父元素,number()并不将其转换为0,而是转换为NaN。对于这些节点,可以用number(boolean(text())的方式转换为。

[root/e2/e2-1][ceiling( 789.789 )=790]
[root/e2/e2-2/e2-2-1][floor( 0120.12 )=120]
[root/e1/e1-1-1 + root/e3/e3-1-1][ 1231.23 + 6.78678 = 1238.01678]
[root/e2/e2-2/e2-2-1][round( 0120.12 )= 120]
[root/e2 counts of descendants] [count(nodes)= 7] [count(elements)= 4] [count(texts)= 3]
[root/e2][number(text())= NaN] [number(boolean(text()))= 0] [number(string(text()))= NaN]

test3.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html><body>
<xsl:apply-templates select="root/e2"/>
</body></html>
</xsl:template>
<xsl:template match="root/e2">

[root/e2][starts-with(
<xsl:value-of select="descendant::node()[local-name()='e2-2-1']"/>
,'01')=
<xsl:value-of select="starts-with(descendant::node()[local-name()='e2-2-1'],'01')"/>]
[root/e2][starts-with(normalize-space(
<xsl:value-of select="descendant::node()[local-name()='e2-2-1']"/>)
,'01')=
<xsl:value-of select="starts-with(normalize-space(descendant::node()[local-name()='e2-2-1']),'01')"/>]
[starts-with(number(
<xsl:value-of select="descendant::node()[local-name()='e2-2-1']"/>)
,'1')=
<xsl:value-of select="starts-with(number(descendant::node()[local-name()='e2-2-1']),'1')"/>]

<hr/>
[root/e2][starts-with(
0120.12,01)=
<xsl:value-of select="starts-with(0120.12, 01)"/>]
[starts-with(
'0120.12','01')=
<xsl:value-of select="starts-with('0120.12', '01')"/>]
[starts-with(
0120.12,1)=
<xsl:value-of select="starts-with(0120.12, 1)"/>]
[starts-with(
0120.12,00001)=
<xsl:value-of select="starts-with(0120.12, 00001)"/>]
<hr/>
[starts-with(string(
<xsl:value-of select="child::node()[local-name()='e2-3']"/>),'345')=
<xsl:value-of select="starts-with(string(child::node()[local-name()='e2-3']), '345')"/>]
[starts-with(number(
<xsl:value-of select="child::node()[local-name()='e2-3']"/>),'345')=
<xsl:value-of select="starts-with(number(child::node()[local-name()='e2-3']), '345')"/>]
[starts-with(
<xsl:value-of select="local-name()"/>,'e')=
<xsl:value-of select="starts-with(local-name(), e)"/>]
<hr/>

</xsl:template>
</xsl:stylesheet>

结果:这一部分测试字串函数,几点结论:

一、在使用字串函数时,如果参数是节点或节点集要小心地处理空白,否则会产生令你嗔目结舌的结果。很多人习惯在XML文件的编辑软件如UE等中设定将Tab转换为空白,应记得先调用normalize-space()函数去掉不需要的空白。

二、但字串函数的参数不是节点或节点集而需要类型转换时,XSL是依照boolean->number->string的次序进行转换的。

所以对于下图中的0120.12实际上先被转换成120.12,然后被转换成'120.12',00001先转换成1,然后被转换成'1'。

三、substring()以1为头一个字符的索引值

四、translate()函数提供了一种高效、便捷地替换字符的方法,为了达到预定效果,应确保该函数的第二个和第三个参数的字符长度总是相等,因为长度不一时,较长参数的多余字符将被自动截掉。

[root/e2][starts-with( 0120.12 ,'01')= false] [root/e2][starts-with(normalize-space( 0120.12 ) ,'01')= true] [starts-with(number( 0120.12 ) ,'1')= true]



[root/e2][starts-with( 0120.12,01)= true] [starts-with( 0120.12,'01')= false] [starts-with( 0120.12,1)= true] [starts-with( 0120.12,00001)= true]



[starts-with(string( 3453.45 ),'345')= false] [starts-with(number( 3453.45 ),'345')= true] [starts-with( e2,'e')= true]



[string-length( 789.789 )= 29] [string-length(normalize-space( 789.789 ))= 7]
[contains( 789.789 , 789)= true]
[substring('substring',3,4)= bstr] [substring(123456, 2,10)= 23456] [substring(123456, -2,4)= 1] [substring(123456, 5,-2)= ]
[substring-after('12-34-56', '-')= 34-56] [substring-after('12-34-56', '')= 12-34-56]
[substring-before('12-34-56', '-')= 12] [substring-before('12-34-56', '')= ]
[translate('12a34b56c', 'abc', 'xyz')= 12x34y56z] [translate('12a34b56c', 'abcdefg', 'xyz')= 12x34y56z] [translate('12a34b56c', 'abc', 'xyzlmn')= 12x34y56z] [translate('12a34b56c78a90b12c', 'abc', 'xyz')= 12x34y56z78x90y12z]
分享到:
评论

相关推荐

    跟我学XSL电子资源下载

    6. **样式表结构**:探讨如何组织XSL样式表,包括导入和包含其他样式表的机制。 7. **转换过程**:阐述XML到HTML、SVG或其他格式的转换流程,以及如何控制输出结果的样式和布局。 8. **实际应用**:通过实例演示...

    基于XML的同学录(xsl样式表)

    主要实现了基于XML的同学录,根据XML文档,用DTD检验及保证其有效性,使其结构完整良好,编写xsl文档,使其按照规定的样表显示,并运用XPath、Xlink、Xpointer等实现向HTML的转换,最后显示在浏览器上。直观,简单,...

    XSL基础教程 从 XSLT 样式表调用 JavaScript

    这些规则通常包含在XSL样式表中,其中可以包含元素选择器、模式匹配和转换指令。XSLT不仅处理XML的结构,还可以处理文本、图像、HTML等,使得XML数据能够以用户友好的方式展现。 **XSLT与JavaScript的交互** 在...

    XSL、XPATH技术文档

    XSL是一种用于转换XML(Extensible Markup Language)文档的样式表语言。它允许开发者将XML数据转换成其他格式,如HTML、PDF或者纯文本,以便于在不同的环境中呈现或处理。XSL由三部分组成:XSL Transformations ...

    XSL开发基础参考资料

    XSL元素是XSL样式表的基本构建块,它们定义了如何转换XML文档。常见的XSL元素包括模板(`&lt;xsl:template&gt;`),用于定义如何处理XML节点;选择器(`&lt;xsl:apply-templates&gt;`),用于应用模板到XML文档的特定部分;变量...

    XML学习文档(DTD Schema SAX DOM XSL XPATH)

    总结来说,XML学习文档覆盖了从XML的基础到进阶的解析方式、文档验证、样式表转换以及路径导航等多个方面。理解并掌握这些知识点,对于深入理解和使用XML,以及进行数据处理和交换具有重要意义。

    xsl javascript 传递参数

    这里,`xmlData`和`xslData`分别代表XML文档和XSL样式表的字符串表示,`contactType`参数被设置为"friend",这将在XSL模板中用于筛选出朋友类型的联系人。 `contactsextra.xml`可能是我们的XML数据源,包含联系人...

    XPath教程

    在XSL(Extensible Stylesheet Language,可扩展样式表语言)中,XPath被广泛用于数据转换,因为它能方便地选取XML数据并对其进行操作。 XPath的基本概念包括节点、轴、节点测试和谓语。节点是XML文档的构成元素,...

    跟我学xsl.doc

    学习XSL不仅包括理解基本概念,还需要掌握如变量、函数、模板选择、流控制(如条件语句和循环)、以及如何导入和链接其他XSL样式表等高级特性。此外,熟悉XPath的语法和功能对于有效使用XSL至关重要,因为XPath是...

    xpath学习笔记 比较入门大家共享

    XSLT(XSL Transformations)是一种样式表语言,用于转换XML文档。在XSLT中,XPath主要作为选取源XML文档中特定部分的工具。XSLT模板的匹配规则和表达式都依赖于XPath。此外,XQuery和XPointer也是基于XPath表达式的...

    docbook自定义xsl

    本话题将深入探讨如何根据需求自定义DocBook的XSL样式表。 首先,我们要理解XSL的作用。XSL是XML的一个子集,用于转换XML文档的结构,通过模板匹配和规则定义,实现XML到HTML、PDF或其他格式的转换。在DocBook中,...

    xsl教程

    通过调用`TransformerFactory.newInstance()`创建一个工厂,然后使用`newTransformer()`方法加载XSL样式表。接着,`transform()`方法执行实际的转换操作,输入源和结果目标分别由`StreamSource`和`StreamResult`表示...

    XSL学习3

    4. **xsl**:这个文件名可能表示一个XSL样式表文件,其中包含了实际的XSL代码。读者可以分析这个示例文件来学习如何在实际场景中应用XSL进行数据转换。 综合这些资源,学习者可以系统地了解和掌握XSL,从基础概念到...

    XSL学习 XSL学习.pdf

    XSL(Extensible Stylesheet Language,可扩展样式表语言)是一种用于控制 XML 数据呈现方式的标准语言。类似于 CSS 对于 HTML 的作用,XSL 使得 XML 数据能够按照预定义的格式进行展现。 #### 二、XSL 的组成部分 ...

    xsl学习笔记,入门知识

    XSL(Extensible Stylesheet Language)是一种样式表语言,用于转换XML文档的结构和格式,使其更适合人类阅读或机器处理。XSL分为三个主要部分:XSLT(XSL Transformations)、XPath(XML Path Language)和XSL-FO...

    XSL学习资料

    XSLT标准API是开发者与XSLT引擎交互的接口,它允许程序动态地创建、修改和执行XSLT样式表。手册可能涵盖了XPath(XML路径语言)、XSLT函数库、DOM(Document Object Model)操作等内容。通过深入学习,你可以了解...

    XML技术教学大纲

    通过本课程的学习,使学生掌握XML应用基础知识,具备使用XML开发Web站点必备的基础知识、在XML中如何使用DTD,XML Schema知识、XML样式表、使用CSS格式格式化XML,XSL样式表,名称空间、XML DOM与XPath,以及XML的...

    使用xsl导出excel源码示例

    2. **XSL样式表结构**:一个XSL样式表由模板组成,这些模板定义了如何处理XML文档中的元素。模板使用XPath(XML Path Language)来定位XML数据,并使用XSL指令来决定输出的形式。 3. **Excel格式化**:在XSLT中,...

    XSL 中文教程大全

    - **XSL样式表(XSLT Stylesheets)**:定义了转换规则,描述如何将XML文档转换为其他形式。 - **XPath**:XML Path Language,XSLT中的路径表达式语言,用于在XML文档中查找和选取节点。 2. **XSLT的处理模型** ...

    XPath and XSLT

    它的主要目标是样式表(XSL样式表),它定义了如何将输入XML转换为输出。XSLT样式表由模板规则组成,这些规则匹配XML文档中的特定部分,并定义了如何处理这些匹配的部分。例如,一个模板可能规定遇到某个元素时,将...

Global site tag (gtag.js) - Google Analytics