XSLT2.0----<xsl:analyze-string>

<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}字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值