`
persistC
  • 浏览: 73503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

xsl2.0正则

    博客分类:
  • XSLT
阅读更多

<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

分享到:
评论

相关推荐

    'replace' 不是一个有效的 XSLT 或 XPath 函数

    在XSLT 2.0及更高版本中,`replace()` 函数被引入,允许用户根据正则表达式替换字符串中的部分文本。但在XSLT 1.0中,这个函数并未定义,因此如果你在1.0环境中使用它,会收到此错误。 **XSLT 1.0与2.0的区别:** 1...

    XSLT指南

    - **XSLT 2.0**引入了更多高级功能,如支持正则表达式、日期和时间操作、函数库的扩展等。 - **XSLT 3.0**进一步增强了性能,加入了流式处理、静态类型检查和异步处理等功能。 ### 6. 实际应用 XSLT广泛应用于数据...

    xslt手册

    6. XSLT 1.0与XSLT 2.0/3.0的区别:XSLT 2.0引入了许多新功能,如正则表达式支持、函数库扩展、更多数据类型和更强大的样式表组合能力。XSLT 3.0进一步增强了这些特性,如支持静态类型检查、流式处理API和异步处理。...

    VB增强搜索插件 v2.3.0.74 (完整压缩包)

    正则搜索、替换字符串 搜索结果列表 搜索结果相关代码预览 替换结果相关代码预览 可取消当前搜索操作 双击定位结果代码 更新记录: v2.3.0.74 调整过滤器应用时的算法 在快捷菜单中增加"显示搜索对话框"项 ...

    Web-Harvest手册

    `html-to-xml`将HTML内容清理并转换为有效的XML,`regexp`执行正则表达式搜索/替换,`xpath`则在XML源中查找XPath表达式,`xquery`在XML源上执行查询,`xslt`则应用XSL转换。`script`元素允许使用基于Java的脚本语言...

    xslt标准

    - **XSLT 2.0**:于2007年发布,引入了许多新功能,如序列类型、正则表达式路径步骤等,显著增强了XSLT的能力。 - **XSLT 3.0**:进一步改进了处理大规模数据集的能力,支持更复杂的查询和表达式。 #### 三、XSLT的...

    mac 下安装php7全过程介绍

    接下来,我们需要安装pcre(Perl Compatible Regular Expressions)库,它是PHP处理正则表达式的关键组件。你可以从源代码编译安装: ```bash cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/...

    经典嵌入式面试题.docx

    - `--with-xsl=/usr`:XSLT支持。 - `--enable-zend-multibyte`:Zend多字节支持。 - `--enable-zip`:ZIP支持。 - `--with-pcre-regex=/usr`:PCRE正则表达式支持。 以上配置选项涵盖了PHP的各种功能和扩展支持,...

    AJAX基础概念、核心技术与典型案例(内涵动态实例)

    AjaxWeb 基于Ajax的Web 2.0模式的刷新模式 AsyncAjaxSample Ajax异步调用的完整示例 第2章(/C02/) 2.1.htm 3段JS使用形式 2.2.htm 不同浏览器使用“&lt;noscript&gt;&lt;/noscript&gt;” 2.3....

    ASP.NET3.5从入门到精通

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全11-15

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全1-5

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASPNET35开发大全第一章

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

    ASP.NET 3.5 开发大全word课件

    5.17.4 正则验证控件(RegularExpressionValidator) 5.17.5 自定义逻辑验证控件(CustomValidator) 5.17.6 验证组控件(ValidationSummary) 5.18 导航控件 5.19 其他控件 5.19.1 隐藏输入框控件(HiddenField) ...

Global site tag (gtag.js) - Google Analytics