正则表达式在XSLT2.0中的运用实例. analyze-string tokenize()

原创 2016年08月29日 21:01:25

XSLT2.0相比XSLT1.0一个很大的进步是增强了正则表达式运用.

下面主要讲下: <xsl:analyze-string select="" regex="">元素.

通过select指定进行匹配的数据源,regex则提供对应的正则表达式的表示.

当匹配结果为true时候可以执行该元素下面的.<xsl:matching-substring/>

当匹配结果为false时候执行该元素内部的.<xsl:non-matching-substring/>


tokenize($content,$token)函数则主要用于拆分源字符串.通过提供$content参数和$token参数来指定拆分规则.


相关例子:

Step A.从外部文件中读取数据.(运用unparsed-text()函数)

Step B.对所读取的数据进行每一行的拆分. (运用tokenize()函数)

Step C.对每行数据进行规格匹配,找出符合规格和不符合规格的数据.(运用analyze-string元素)

             (注:符合规格的将进行XML序列化,不符合规格的行数据将直接作为备注输出)

Step D.对数据进行排序后重新序列化.(运用for-each-group元素及result-document元素)


数据源: empolyees.csv 文件.(其中第九行不符合规则)

Joe, Fawcett, Developer, IT  
Max, Bialystock, CEO, Management  
Phineas, Barnum, Head of Sales, Sales and Marketing  
Leo, Bloom, Auditor, Accounts  
Danny, Ayers, Developer, IT  
Carmen, Ghia, PA to the VP of Products, Management  
Ulla, Anderson, Head of Promotions, Sales and Marketing  
Grace, Hopper, Developer, IT  
<!--This line is invalid line-->
Bob, Cratchit, Bookkeeper, Accounts  
Charles, Babbage, Head of Infrastructure, IT  
Roger, De Bris, VP of Products, Management  
Willy, Loman, Salesman, Sales and Marketing  
Franz, Liebkind, Developer, IT  
Luca, Pacioli, Accountant, Accounts  
Lorenzo, St. DuBois, Project Manager, IT  

XSLT文件: empolyees.xslt 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="2.0"
				xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
				xmlns:xs="http://www.w3.org/2001/XMLSchema"
				xmlns:myFunction="http://www.ricky.com/myFunction"
				exclude-result-prefixes="xs myFunction">
	<xsl:output indent="yes"/>
	<xsl:variable name="empolyeesInfo" select="tokenize(unparsed-text('empolyees.csv'),'\n')" as="xs:string*"/>

	<xsl:template name="main">
		<xsl:call-template name="createEmpolyeeFile"/>
		<xsl:call-template name="sortAndResaveTheEmpolyees"/>
	</xsl:template>

	<xsl:template name="createEmpolyeeFile">
		<xsl:variable name="regex" select="'^\s*([^,]+)\s*,\s*([^,]+)\s*,\s*([^,]+)\s*,\s*([^,]+)\s*$'" as="xs:string"/>
		<xsl:result-document href="empolyees.xml">
			<empolyees>
				<xsl:for-each select="$empolyeesInfo">
					<xsl:variable name="data" select="." as="xs:string"/>
					<xsl:variable name="position" select="position()" as="xs:integer"/>
					<xsl:analyze-string select="$data" regex="{$regex}">
						<!-- the data must match the regex-expression  -->
						<xsl:matching-substring>
							<xsl:call-template name="saveSeparateEmpolyee">
								<xsl:with-param name="firstName" select="regex-group(1)" as="xs:string"/>
								<xsl:with-param name="lastName" select="regex-group(2)" as="xs:string"/>
								<xsl:with-param name="jobTitle" select="regex-group(3)" as="xs:string"/>
								<xsl:with-param name="department" select="myFunction:replaceAll(regex-group(4),'\s*
','')" as="xs:string"/>
							</xsl:call-template>
							<xsl:call-template name="createEmpolyee">
								<xsl:with-param name="firstName" select="regex-group(1)" as="xs:string"/>
								<xsl:with-param name="lastName" select="regex-group(2)" as="xs:string"/>
								<xsl:with-param name="jobTitle" select="regex-group(3)" as="xs:string"/>
								<xsl:with-param name="department" select="myFunction:replaceAll(regex-group(4),'\s*
','')" as="xs:string"/>
							</xsl:call-template>
						</xsl:matching-substring>
						<xsl:non-matching-substring>
							<xsl:call-template name="invalidData">
								<xsl:with-param name="data" select="$data"/>
								<xsl:with-param name="position" select="$position"/>
							</xsl:call-template>
						</xsl:non-matching-substring>
					</xsl:analyze-string>
				</xsl:for-each>
			</empolyees>
		</xsl:result-document>
	</xsl:template>

	<xsl:template name="sortAndResaveTheEmpolyees">
		
		<xsl:variable name="empolyees" select="document('empolyees.xml')"/>
		<xsl:result-document href="empolyeesAfterSort.xml">
			<empolyees>
				<xsl:for-each-group select="$empolyees/empolyees/empolyee" group-by="@department">
					<xsl:sort select="@department" data-type="text"/>
					<department department="{current-grouping-key()}">
						<xsl:for-each select="current-group()">
							<xsl:sort select="@firstName" data-type="text"/>
							<xsl:sort select="@lastName" data-type="text"/>
							<empolyee>
								<firstName>
									<xsl:value-of select="@firstName"/>
								</firstName>
								<lastName>
									<xsl:value-of select="@lastName"/>
								</lastName>
								<jobTitle>
									<xsl:value-of select="@jobTitle"/>
								</jobTitle>
							</empolyee>
						</xsl:for-each>
					</department>
				</xsl:for-each-group>
			</empolyees>
		</xsl:result-document>
	</xsl:template>

	<xsl:template name="saveSeparateEmpolyee">
		<!-- save each empolyee in separate file. firstName-lastName.xml -->
		<xsl:param name="firstName" as="xs:string"/>
		<xsl:param name="lastName" as="xs:string"/>
		<xsl:param name="jobTitle" as="xs:string"/>
		<xsl:param name="department" as="xs:string"/>
		<xsl:result-document href="{concat($firstName,'-',$lastName)}.xml">
			<empolyee firstName="{$firstName}" lastName="{$lastName}" department="{$department}" jobTitle="{$jobTitle}"/>
		</xsl:result-document>

	</xsl:template>

	<xsl:template name="createEmpolyee">
		<xsl:param name="firstName" as="xs:string"/>
		<xsl:param name="lastName" as="xs:string"/>
		<xsl:param name="jobTitle" as="xs:string"/>
		<xsl:param name="department" as="xs:string"/>
		<empolyee firstName="{$firstName}" lastName="{$lastName}" department="{$department}" jobTitle="{$jobTitle}"/>
	</xsl:template>

	<xsl:template name="invalidData">
		<xsl:param name="data" as="xs:string"/>
		<xsl:param name="position" as="xs:integer"/>
		<xsl:comment>
			<xsl:value-of select="concat('Found invalid content.line:',$position,' content: ',$data)"/>
		</xsl:comment>
	</xsl:template>

	<!-- limit function -->
	<xsl:function name="myFunction:replaceAll">
		<xsl:param name="content" as="xs:string"/>
		<xsl:param name="regex" as="xs:string"/>
		<xsl:param name="replacement" as="xs:string"/>
		<xsl:analyze-string select="$content" regex="^(.*?){$regex}(.*)$">
			<xsl:matching-substring>
				<xsl:variable name="front" as="xs:string">
					<xsl:value-of select="regex-group(1)"/>
				</xsl:variable>
				<xsl:variable name="after" as="xs:string">
					<xsl:value-of select="regex-group(2)"/>
				</xsl:variable>
				<xsl:variable name="newContent" select="concat($front,$replacement,$after)"/>
				<xsl:value-of select="myFunction:replaceAll($newContent,$regex,$replacement)"/>
			</xsl:matching-substring>
			<xsl:non-matching-substring>
				<xsl:value-of select="$content"/>
			</xsl:non-matching-substring>
		</xsl:analyze-string>
	</xsl:function>
</xsl:stylesheet>

采用的是Saxon解析器.

对应命令:java net.sf.saxon.Transform -it:main -xsl:empolyees.xslt

版权声明:本文为博主原创文章,未经博主允许不得转载。

XSLT表达式处理技术

我们将选择你已经在以前的信息里了解的各种各样的功能和表达方式并且描述怎样把他们嵌入在处理指令的顺序里面。通常,这发生在一些标记的元素或者其他标记的元素的范围内,因为这些元素在XSLT里履行了特定的角色...
  • foxiang
  • foxiang
  • 2006年07月18日 13:38
  • 988

XSLT2.0 从外部读取信息并分析生成对应文件.采用xsl:for-each-group进行排序输出

解析器:Saxon XSLT2.0相对于XSLT1.0增加了unparsed-text() collection() 函数.并且支持xsl:for-each-group来对数据进行排序. ...

XSLT简单教程--XSLT的实例

XSLT如何转换XML我们打个有趣的比方,你玩过橡皮泥吧,用不同的模子按上去,就可以做出需要的形状。如果我们假设XML数据文档是一块大橡皮泥,XSLT就象是一个模子,用力一按,就做出需要的形状来---...

xslt2.0 正则表达式

转载地址:http://electiger.blog.51cto.com/112940/19416 是XSLT2.0新增的指令,语法: 该指令的主要用途为分析字符串。select属性用于指定要...

标准C++以及MFC6.0字符串的tokenize和split函数

标准C++字符串string以及MFC6.0字符串CString的tokenize和split函数。 1、标准串的: /**************************************...
  • educast
  • educast
  • 2013年08月31日 15:42
  • 2245

StringTokenizer类的使用

StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数。 1.构造函数 public StringTokenizer(String str) public ...
  • riyunzhu
  • riyunzhu
  • 2012年09月17日 20:06
  • 86624

java中正则表达式运用实例(用String类的matches方法演示)

测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * @author ...

lua string库函数详解、实例及lua正则表达式

对lua的string库进行详细解释,并附上实例说明,供大家参考。
  • wlgy123
  • wlgy123
  • 2015年10月17日 18:55
  • 5844

Java中正则表达式运用实例

正则表达式是很重要,这点就不需要我说什么了。

NET2.0隐形的翅膀,正则表达式搜魂者【月儿原创】

RegularExpressionValidator控件 使用RegularExpressionValidator控件,当然也可以不用RegularExpressionValidator控件在后台直...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则表达式在XSLT2.0中的运用实例. analyze-string tokenize()
举报原因:
原因补充:

(最多只允许输入30个字)