正则表达式在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

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

相关文章推荐

xslt2.0 正则表达式

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

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

对lua的string库进行详细解释,并附上实例说明,供大家参考。

string正则表达式

  • 2015-11-14 10:29
  • 9.86MB
  • 下载

Java中正则表达式运用实例

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

.NET2.0隐形的翅膀,正则表达式搜魂者

本文实现了: 只能输入1个数字 只能输入n个数字 只能输入至少n个数字 只能输入m到n个数字 只能输入数字 只能输入某个区间数字 只能输入0和非0打头的数字 只能输入实数 只能输入n...

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

RegularExpressionValidator控件 使用RegularExpressionValidator控件,当然也可以不用RegularExpressionValidator控件在后台直...

jQuery选择器代码详解(五)——实例说明tokenize的解析过程

原创文章,转载请写明出处,多谢! 以下分析基于jQuery-1.10.2.js版本。 下面将以$("div:not(.class:contain('span')):eq(3)")为例,说明tokeni...
  • mole
  • mole
  • 2015-02-14 00:04
  • 1038

.NET2.0隐形的翅膀,正则表达式搜魂者

作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.14本文实现了:只能输入1个数字只能输入n个数字只能输入至少n个数字只能输入...

正则表达式测试软件V2.0

  • 2008-09-12 09:04
  • 83KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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