XSLT2.0实用的新功能 .(转)
转自:http://blog.csdn.net/crystalbruce/article/details/7407631
2007年1月,W3C发布了XSLT2.0规范,2009年发布了XSLT2.1,XSLT3.0预计今年发布
!
分组
函数:node-set current-group():该函数返回分组所包含的节点集。
函数:node-set current-grouping-key():该函数返回当前分组的条件(控制分分组的关键节点)。
<!-- Category: instruction -->
<xsl:for-each-group
select = expression
group-by? = expression
group-adjacent? = expression
group-starting-with? = pattern
group-ending-with? = pattern
collation? = { uri }>
<!-- Content: (xsl:sort*, sequence-constructor) -->
</xsl:for-each-group>
属性详解:
1:select:用于指定需要分组的节点;
2:group-by:用于控制分组的关键节点;
3:group-adjacent:用于控制分组的关键节点,并且只将相邻的元素分为一组;
4:group-starting-with:指定分组的开始节点;
5:group-ending-with:指定分组的结束节点;
The following example groups a list of nodes based on common values. The resulting groups are numbered but unsorted, and a total is calculated for each group.
Source XML document:
- <cities>
- <city name="Milano" country="Italia" pop="5"/>
- <city name="Paris" country="France" pop="7"/>
- <city name="München" country="Deutschland" pop="4"/>
- <city name="Lyon" country="France" pop="2"/>
- <city name="Venezia" country="Italia" pop="1"/>
- </cities>
<cities>
<city name="Milano" country="Italia" pop="5"/>
<city name="Paris" country="France" pop="7"/>
<city name="München" country="Deutschland" pop="4"/>
<city name="Lyon" country="France" pop="2"/>
<city name="Venezia" country="Italia" pop="1"/>
</cities>
Desired output:
- <table>
- <tr>
- <th>Position</th>
- <th>Country</th>
- <th>List of Cities</th>
- <th>Population</th>
- </tr>
- <tr>
- <td>1</td>
- <td>Italia</td>
- <td>Milano, Venezia</td>
- <td>6</td>
- </tr>
- <tr>
- <td>2</td>
- <td>France</td>
- <td>Lyon, Paris</td>
- <td>9</td>
- </tr>
- <tr>
- <td>3</td>
- <td>Deutschland</td>
- <td>München</td>
- <td>4</td>
- </tr>
- </table>
<table>
<tr>
<th>Position</th>
<th>Country</th>
<th>List of Cities</th>
<th>Population</th>
</tr>
<tr>
<td>1</td>
<td>Italia</td>
<td>Milano, Venezia</td>
<td>6</td>
</tr>
<tr>
<td>2</td>
<td>France</td>
<td>Lyon, Paris</td>
<td>9</td>
</tr>
<tr>
<td>3</td>
<td>Deutschland</td>
<td>München</td>
<td>4</td>
</tr>
</table>
Solution:
- <table xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <tr>
- <th>Position</th>
- <th>Country</th>
- <th>City List</th>
- <th>Population</th>
- </tr>
- <xsl:for-each-group select="cities/city" group-by="@country">
- <tr>
- <td><xsl:value-of select="position()"/></td>
- <td><xsl:value-of select="@country"/></td>
- <td>
- <xsl:value-of select="current-group()/@name" separator=", "/>
- </td>
- <td><xsl:value-of select="sum(current-group()/@pop)"/></td>
- </tr>
- </xsl:for-each-group>
- </table>
<table xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<tr>
<th>Position</th>
<th>Country</th>
<th>City List</th>
<th>Population</th>
</tr>
<xsl:for-each-group select="cities/city" group-by="@country">
<tr>
<td><xsl:value-of select="position()"/></td>
<td><xsl:value-of select="@country"/></td>
<td>
<xsl:value-of select="current-group()/@name" separator=", "/>
</td>
<td><xsl:value-of select="sum(current-group()/@pop)"/></td>
</tr>
</xsl:for-each-group>
</table>
自定义函数
<!-- Category: declaration -->
<xsl:function
name = qname
as? = sequence-type
override? = "yes" | "no">
<!-- Content: (xsl:param*, sequence-constructor) -->
</xsl:function>
属性详解:
1:name:函数名;
2:as:函数的返回值;
3:override:当存在同名函数时,是否覆盖。
<funciton.../>中可包含N个<param.../>子元素,用于为该函数定义形参。
<!-- Category: declaration -->
<xsl:param
name = qname
select? = expression
as? = sequence-type
required? = "yes" | "no"
tunnel? = "yes" | "no">
<!-- Content: sequence-constructor -->
</xsl:param>
属性详解:
as:指定形参的数据类型;
tunnel:默认是no,用于指定该参数是一个tunnel参数。
The following example creates a recursive stylesheet function named str:reverse that reverses the words in a supplied sentence, and then invokes this function from within a template rule.
- <xsl:transform
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns:str="http://example.com/namespace"
- version="2.0"
- exclude-result-prefixes="str">
- <xsl:function name="str:reverse" as="xs:string">
- <xsl:param name="sentence" as="xs:string"/>
- <xsl:sequence
- select="if (contains($sentence, ' '))
- then concat(str:reverse(substring-after($sentence, ' ')),
- ' ',
- substring-before($sentence, ' '))
- else $sentence"/>
- </xsl:function>
- <xsl:template match="/">
- <output>
- <xsl:value-of select="str:reverse('DOG BITES MAN')"/>
- </output>
- </xsl:template>
- </xsl:transform>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:str="http://example.com/namespace"
version="2.0"
exclude-result-prefixes="str"> <xsl:function name="str:reverse" as="xs:string">
<xsl:param name="sentence" as="xs:string"/>
<xsl:sequence
select="if (contains($sentence, ' '))
then concat(str:reverse(substring-after($sentence, ' ')),
' ',
substring-before($sentence, ' '))
else $sentence"/>
</xsl:function> <xsl:template match="/">
<output>
<xsl:value-of select="str:reverse('DOG BITES MAN')"/>
</output>
</xsl:template> </xsl:transform>
An alternative way of writing the same function is to implement the conditional logic at the XSLT level, thus:
- <xsl:function name="str:reverse" as="xs:string">
- <xsl:param name="sentence" as="xs:string"/>
- <xsl:choose>
- <xsl:when test="contains($sentence, ' ')">
- <xsl:sequence select="concat(str:reverse(substring-after($sentence, ' ')),
- ' ',
- substring-before($sentence, ' '))"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:sequence select="$sentence"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:function>
<xsl:function name="str:reverse" as="xs:string">
<xsl:param name="sentence" as="xs:string"/>
<xsl:choose>
<xsl:when test="contains($sentence, ' ')">
<xsl:sequence select="concat(str:reverse(substring-after($sentence, ' ')),
' ',
substring-before($sentence, ' '))"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="$sentence"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
Final Result Trees
<!-- Category: instruction -->
<xsl:result-document
format? = { qname }
href? = { uri-reference }
validation? = "strict" | "lax" | "preserve" | "strip"
type? = qname
method? = { "xml" | "html" | "xhtml" | "text" | qname-but-not-ncname }
byte-order-mark? = { "yes" | "no" }
cdata-section-elements? = { qnames }
doctype-public? = { string }
doctype-system? = { string }
encoding? = { string }
escape-uri-attributes? = { "yes" | "no" }
include-content-type? = { "yes" | "no" }
indent? = { "yes" | "no" }
media-type? = { string }
normalization-form? = { "NFC" | "NFD" | "NFKC" | "NFKD" | "fully-normalized" | "none" |nmtoken }
omit-xml-declaration? = { "yes" | "no" }
standalone? = { "yes" | "no" | "omit" }
undeclare-prefixes? = { "yes" | "no" }
use-character-maps? = qnames
output-version? = { nmtoken }>
<!-- Content: sequence-constructor -->
</xsl:result-document>
属性解释:
1:format:指定输出结果文档的格式,属性值是一个<output.../>元素的name属性值。
2:href:指定输出结果文档的文件路径。
The following example takes an XHTML document as input, and breaks it up so that the text following each <h1> element is included in a separate document. A new documenttoc.html is constructed to act as an index:
- <xsl:stylesheet
- version="2.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:xhtml="http://www.w3.org/1999/xhtml">
- <xsl:output name="toc-format" method="xhtml" indent="yes"
- doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
- doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>
- <xsl:output name="section-format" method="xhtml" indent="no"
- doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
- doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>
- <xsl:template match="/">
- <xsl:result-document href="toc.html" format="toc-format" validation="strict">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head><title>Table of Contents</title></head>
- <body>
- <h1>Table of Contents</h1>
- <xsl:for-each select="/*/xhtml:body/(*[1] | xhtml:h1)">
- <p><a href="section{position()}.html"><xsl:value-of select="."/></a></p>
- </xsl:for-each>
- </body>
- </html>
- </xsl:result-document>
- <xsl:for-each-group select="/*/xhtml:body/*" group-starting-with="xhtml:h1">
- <xsl:result-document href="section{position()}.html"
- format="section-format" validation="strip">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head><title><xsl:value-of select="."/></title></head>
- <body>
- <xsl:copy-of select="current-group()"/>
- </body>
- </html>
- </xsl:result-document>
- </xsl:for-each-group>
- </xsl:template>
- </xsl:stylesheet>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"> <xsl:output name="toc-format" method="xhtml" indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/> <xsl:output name="section-format" method="xhtml" indent="no"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> <xsl:template match="/">
<xsl:result-document href="toc.html" format="toc-format" validation="strict">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Table of Contents</title></head>
<body>
<h1>Table of Contents</h1>
<xsl:for-each select="/*/xhtml:body/(*[1] | xhtml:h1)">
<p><a href="section{position()}.html"><xsl:value-of select="."/></a></p>
</xsl:for-each>
</body>
</html>
</xsl:result-document>
<xsl:for-each-group select="/*/xhtml:body/*" group-starting-with="xhtml:h1">
<xsl:result-document href="section{position()}.html"
format="section-format" validation="strip">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title><xsl:value-of select="."/></title></head>
<body>
<xsl:copy-of select="current-group()"/>
</body>
</html>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template> </xsl:stylesheet>
字符映射
<!-- Category: declaration -->
<xsl:character-map
name = qname
use-character-maps? = qnames>
<!-- Content: (xsl:output-character*) -->
</xsl:character-map>
属性解释:
1:name:标识符;
2:use-character-maps:用于包含另外一个字符映射。
<xsl:output-character
character = char
string = string />
属性解释:
用character的属性值替代string的属性值。
Character maps can be useful when producing serialized output in a format that resembles, but is not strictly conformant to, HTML or XML. For example, when the output is a JSP page, there might be a need to generate the output:
- <jsp:setProperty name="user" property="id" value='<%= "id" + idValue %>'/>
<jsp:setProperty name="user" property="id" value='<%= "id" + idValue %>'/>
Although this output is not well-formed XML or HTML, it is valid in Java Server Pages. This can be achieved by allocating three Unicode characters (which are not needed for any other purpose) to represent the strings<%,%>, and ", for example:
- <xsl:character-map name="jsp">
- <xsl:output-character character="«" string="<%"/>
- <xsl:output-character character="»" string="%>"/>
- <xsl:output-character character="§" string='"'/>
- </xsl:character-map>
<xsl:character-map name="jsp">
<xsl:output-character character="«" string="<%"/>
<xsl:output-character character="»" string="%>"/>
<xsl:output-character character="§" string='"'/>
</xsl:character-map>
When this character map is referenced in the xsl:output declaration, the required output can be produced by writing the following in the stylesheet:
- <jsp:setProperty name="user" property="id" value='«= §id§ + idValue »'/>
<jsp:setProperty name="user" property="id" value='«= §id§ + idValue »'/>
This works on the assumption that when an apostrophe or quotation mark is generated as part of an attribute value by the use of character maps, the serializer will (where possible) use the other choice of delimiter around the attribute value.
数据类型绑定
在<variable.../>、<param.../>和<with-param.../>元素中使用as属性,指定其数据类型,前面示例中用过。
正则表达式
<!-- Category: instruction -->
<xsl:analyze-string
select = expression
regex = { string }
flags? = { string }>
<!-- Content: (xsl:matching-substring?, xsl:non-matching-substring?, xsl:fallback*) -->
</xsl:analyze-string>
<xsl:matching-substring>
<!-- Content: sequence-constructor -->
</xsl:matching-substring>
<xsl:non-matching-substring>
<!-- Content: sequence-constructor -->
</xsl:non-matching-substring>
呃!直接理解字面意思就可
Problem: the input string contains a date such as 23 March 2002. Convert it to the form2002-03-23.
Solution (with no error handling if the input format is incorrect):
- <xsl:variable name="months" select="'January', 'February', 'March', ..."/>
- <xsl:analyze-string select="normalize-space($input)"
- regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">
- <xsl:matching-substring>
- <xsl:number value="regex-group(3)" format="0001"/>
- <xsl:text>-</xsl:text>
- <xsl:number value="index-of($months, regex-group(2))" format="01"/>
- <xsl:text>-</xsl:text>
- <xsl:number value="regex-group(1)" format="01"/>
- </xsl:matching-substring>
- </xsl:analyze-string>
<xsl:variable name="months" select="'January', 'February', 'March', ..."/> <xsl:analyze-string select="normalize-space($input)"
regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">
<xsl:matching-substring>
<xsl:number value="regex-group(3)" format="0001"/>
<xsl:text>-</xsl:text>
<xsl:number value="index-of($months, regex-group(2))" format="01"/>
<xsl:text>-</xsl:text>
<xsl:number value="regex-group(1)" format="01"/>
</xsl:matching-substring>
</xsl:analyze-string>
Note the use of normalize-space to simplify the work done by the regular expression, and the use of doubled curly brackets because theregex attribute is an attribute value template.
XSLT2.0实用的新功能 .(转)的更多相关文章
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- Bash 5.0 发布及其新功能
导读 邮件列表证实最近发布了 Bash-5.0.而且,令人兴奋的是它还有新的功能和变量.如果你一直在使用 Bash 4.4.XX,那么你一定会喜欢 Bash 的第五个主要版本. 第五个版本侧重于新的 ...
- Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance
在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...
- Android Studio 3.0 下载 使用新功能介绍
谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...
- 干货来袭:Redis5.0支持的新功能说明
Redis5.0支持的新特性说明 本文内容来自华为云帮助中心 华为云DCS的Redis5.x版本继承了4.x版本的所有功能增强以及新的命令,同时还兼容开源Redis5.x版本的新增特性. Stream ...
- Redis4.0支持的新功能说明
本文以华为云DCS for Redis版本为例,介绍Redis4.0的新功能.文章转载自华为云帮助中心. 与Redis3.x版本相比,DCS的Redis4.x以上版本,除了开源Redis增加的特性之外 ...
- React Native 0.50版本新功能简介
React Native在2017年经历了众多版本的迭代,从接触的0.29版本开始,到前不久发布的0.52版本,React Native作为目前最受欢迎的移动跨平台方案.虽然,目前存在着很多的功能和性 ...
- Apache Kafka 0.11版本新功能简介
Apache Kafka近日推出0.11版本.这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics) ...
- 161128、Redis 4.0发布及其新功能介绍
Redis 4.0-rc1 发布了,这是 4.0 的首个 RC 版.Redis 是一个高性能的key-value数据库.Redis 的出现,很大程度补偿了memcached这类keyvalue存储的不 ...
随机推荐
- 套题T5//各种树
树(tree) [题目描述] 方方方种下了三棵树,一年后,第一棵树长出了n个节点. 方方方会向你提出m个询问,每个询问给出两个数i,j,你需要回答i号节点和j号节点在树上的距离. [输入数据] 第一行 ...
- PKUSC 模拟赛 day1 上午总结
思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...
- 李洪强漫谈iOS开发[C语言-008]- C语言重难点
C语言学习的重难点 写程序的三个境界: 照抄的境界,翻译的境界,创新的境界 1 伪代码: 描述C语言的编程范式 范式: 规范的一种表示 对于C的范式学会的话,C, C++ Java 都会了 2 ...
- HDU2521反素数
只是了解下这种简单的数论定义,解释可以戳这个 http://www.cnblogs.com/Findxiaoxun/p/3460450.html ,然后按Ctrl+ F搜索 反素数 ,找到那一部 ...
- POI 中的CellRangeAddress 参数
在用poi在EXECL报表设计的时候,遇到单元格合并问题,用到一个重要的函数: CellRangeAddress(int, int, int, int) 参数:起始行号,终止行号, 起始列号,终止列号 ...
- The type sun.management.ManagementFactory is not visible
Eclipse默认将这些受访问限制的API设成了Error.解决方法:只要将Windows---Preferences---Java--Complicer---Errors/Warings里面的Dep ...
- 自定义View(6)paint设置图图层重叠时的显示方式,包含清空canvas
Paint.setXfermode 这个函数设置两个图层相交时的模式 在已有的图层上绘图将会在其上面添加一层新的图层. 如果新的图层是完全不透明的,那么它将完全遮挡住下面的图层,而setXfermod ...
- const和readonly的区别
http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html http://www.codeproject.com/Tips/803 ...
- toad for sqlserver5.7
toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以使MSSQL DBA们更加的方便管理MSSQL toad for sqlserver5.7就是这样一 ...
- OLAP、OLTP的介绍和比较
OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...