<xsl:analyze-string>是XSLT2.0新增的指令,语法:
<xsl:analyze-string select="xpathExpression" regex="regExpression" flags="flag">
该指令的主要用途为分析字符串。select属性用于指定要分析的字符串,即inputString。
regex指定分析规则--正则表达式。
<xsl:analyze-string>可能包含如下内容元素(子元素):
1,<xsl:matching-substring>
<!---some instruction-->
</xsl:matching-substing>
用于指定符合正则表达式的子字符串所要执行的动作。
2,<xsl:non-matching-substring>
<!---some instruction-->
</xsl:non-matching-substring>
用于指定不符合正则表达式的子字符串所要执行的动作。
<xsl:analyze-string>的执行过程为:首先将输入字符串按照正则表达式分割成若干子字符串。然后依次对每个子字 符串进行操作:如果子字符串符合正则表达式,那么就执行<xsl:matching-substring>指令(如果存在该指令的话);如果 不符合正则表达式,那么就执行<xsl:non-matching-substring>指令(如果存在该指令的话)。
举例来说
<xsl:analyze-string select="abcd1234efg7890" regex="[a-z]+">
<xsl:matching-substring>
<!---some instructions-->
</xsl:matching-substring>
<xsl:non-matching-substring>
<!---some instructions-->
</xsl:non-matching-substring>
</xsl:analyze-string>
首先输入字符串按正则表示被分为四个子字符串--abcd,1234,efg,7890。
接着执行的指令为abcd(matching-instruction)-->1234(non-matching- instruction)-->efg(matching-instruction)-->7890(non-matching- instruction)。
下面举个具体的例子。
XML源文件:
<?xml version="1.0"?>
<root>
<branch>2500ppoabcuv12405tyuvirk</branch>
</root>
XSLT文件:
<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="regex" select="'\d{4}'"/>
<xsl:analyze-string select="root/branch" regex="{$regex}">
<xsl:matching-substring>
<digits><xsl:value-of select="."/></digits>
</xsl:matching-substring>
<xsl:non-matching-substring>
<word><xsl:value-of select="."/></word>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
转换结果:
<digits>2500</digits>
<word>ppoabcuv</word>
<digits>1240</digits>
<word>5tyuvirk</word>
如果将regex的属性直接写成:regex="\d{4}",我们得到的输出结果是:
<word>2500ppoabcuv1</word>
<digits>24</digits>
<word>05tyuvirk</word>
跟正确的结果不符,这是为什么呢?
这是因为在一个非xpath expression中大括号(curly brackets)括起来的内容表示xpath expression。所以,直接写成regex="\d{4}"时,真实的正则表达式变成了\d4。
要想得到\d{4},正则表达式需要写成regex="\d{{4}}"。
在XSLT中一般认为存在两种表示式,一种是xpath表达式,另一种是非xpath表达式。
用select属性指定的表达式一般是xpath表达式。例如:select="root/branch",表示root下的所有branch节点;但href="root/branch"则表示字符串root/branch。
在xpath表达式中不能使用大括号(curly brackets)。
在非xpath表达式中则需要使用大括号(curly brackets)来引用xpath表达式。
大括号在非xpath表达式中的使用一般有如下几种情况:
1,引用节点或属性
{a},{@a}
2,引用变量
{$var}
3,引用字符串
{'#abc'}
4,引用数字
{1}
5,{{expression}}这种形式,表示{expression}字符串。
转载地址:http://electiger.blog.51cto.com/112940/19722
其实,正则表达式是XPATH2.0定义的,暂且放在XSLT里说吧。
还是举例来说正则表达式的用法吧。
XML源文件任意,XSLT文件:
<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/XMLSchema">
<xsl:template match="/">
<xsl:variable name="file" select="'aa.txt'"/>
<xsl:variable name="string" select="unparsed-text($file,ISO-8859-1)" />
<xsl:analyze-string select="$string" regex="\n" >
<xsl:non-matching-substring>
<row>
<xsl:analyze-string select="." regex='("([^"]*)")|([^,]+)'>
<xsl:matching-substring>
<cell>
<xsl:value-of select="regex-group(2)"/>
<xsl:value-of select="regex-group(3)"/>
</cell>
</xsl:matching-substring>
</xsl:analyze-string>
</row>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
摘自XSLT2.0 porgrammer's reference(稍有改动)。
aa.txt的内容:
123,"Mary Jones","IBM","USA",1997-05-14
423,"Barbara Smith","General Motors","USA",1996-03-12
6721,"Martin McDougall","British Airways","UK",2001-01-15
830,"Jonathan Perkins","Springer Verlag","Germany",2000-11-17
得到输出结果:
<?xml version='1.0' ?>
<row xmlns:xs="http://www.w3.org/XMLSchema">
<cell>123</cell>
<cell>Mary Jones</cell>
<cell>IBM</cell>
<cell>USA</cell>
<cell>1997-05-14</cell>
</row>
<row xmlns:xs="http://www.w3.org/XMLSchema">
<cell>423</cell>
<cell>Barbara Smith</cell>
<cell>General Motors</cell>
<cell>USA</cell>
<cell>1996-03-12</cell>
</row>
<row xmlns:xs="http://www.w3.org/XMLSchema">
<cell>6721</cell>
<cell>Martin McDougall</cell>
<cell>British Airways</cell>
<cell>UK</cell>
<cell>2001-01-15</cell>
</row>
<row xmlns:xs="http://www.w3.org/XMLSchema">
<cell>830</cell>
<cell>Jonathan Perkins</cell>
<cell>Springer Verlag</cell>
<cell>Germany</cell>
<cell>2000-11-17</cell>
</row>
我们可以看到寻找与regex匹配的字符串的过程是:首先从input的第一个字符开始,看能否找到,如果找到了,那么就截取该匹配字符,然后从后面的字符开始,再次寻找,如果未找到,就将第一个字符确定为不匹配字符,然后从第二个字符开始寻找,一直到查找完所有字符。
原来的XSLT文件正则表达式匹配的模式为:
<xsl:analyze-string select="," regex='("([^"]*?)")|([^,]+?),'>
* 后面跟一个问号(?),代表非贪婪原则。意思是,一旦找到类似"xxxxx"形式的字符串就认定为匹配字符串。但是在这里没有必要,因为中间的xxxx不 能为"(双引号),也就防止了出现贪婪的"xxx""xxxx"xxx"的形式。也算是对大师提出的一个疑问吧。呵呵。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superwfei/archive/2008/04/07/2256836.aspx