代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

XSLT2.0正则表达式问题(在不同匹配项上打开和关闭元素)

  •  2
  • polygenelubricants  · 技术社区  · 16 年前

    假设我有以下简单的XML文件:

    <main>
      outside1
      ===BEGIN===
        inside1
      ====END====
      outside2
      =BEGIN=
        inside2
      ==END==
      outside3
    </main>
    

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    
    <xsl:template match="text()">
    
      <xsl:analyze-string select="." regex="=+BEGIN=+">
         <xsl:matching-substring>
            <section/>
         </xsl:matching-substring>
         <xsl:non-matching-substring>
              <xsl:analyze-string select="." regex="=+END=+">  
                 <xsl:matching-substring>
                    <_section/>
                 </xsl:matching-substring>
                 <xsl:non-matching-substring>
                    <xsl:value-of select="."/>
                 </xsl:non-matching-substring>
              </xsl:analyze-string>
         </xsl:non-matching-substring>
      </xsl:analyze-string>
    
    </xsl:template>
    
    </xsl:stylesheet>
    

    将其转换为:

    <?xml version="1.0" encoding="UTF-8"?>
      outside1
      <section/>
        inside1
      <_section/>
      outside2
      <section/>
        inside2
      <_section/>
      outside3
    

    以下是问题:

    多个正则表达式

    有没有更好的方法来匹配两个不同的正则表达式,而不是像上面那样将它们嵌套在另一个正则表达式中?

    • 如果它们不能像这样容易地嵌套呢?
    • 我可以用XSL模板来匹配和转换正则表达式中的匹配项吗 text() ?
      • 如果可能,这将是理想的解决方案

    显然,不是:

    <section/>
       inside
    <_section/>
    

    我最终真正想要的是:

    <section>
       inside
    </section>
    

    那你要怎么做?我不确定是否有可能在一个正则表达式匹配中打开一个元素,然后在另一个正则表达式匹配中关闭它(也就是说,如果没有更接近的匹配怎么办?结果将不是格式正确的XML!),但似乎这个任务很典型,必须有一个惯用的解决方案。


    因此,本质上,我试图在Perl中实现以下简洁的功能:

    s/=+BEGIN=+/<section>/
    s/=+END=+/<\/section>/
    

      • (即,它只应转换 节点)
    • 在匹配各种XML实体方面,它也会更加健壮
    1 回复  |  直到 16 年前
        1
  •  1
  •   Dimitre Novatchev    16 年前

    这种转变 :

    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     exclude-result-prefixes="xs"
    >
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
     </xsl:template>
    
     <xsl:template match="text()">
       <xsl:analyze-string select="." flags="mx"
        regex="=+BEGIN=+((.|\n)*?)=+END=+">
    
       <xsl:matching-substring>
        <section><xsl:value-of select="regex-group(1)"/></section>
       </xsl:matching-substring>
    
       <xsl:non-matching-substring>
        <xsl:value-of select="."/>
       </xsl:non-matching-substring>
     </xsl:analyze-string>
     </xsl:template>
    </xsl:stylesheet>
    

    :

    <main>
      outside1
      ===BEGIN===
        inside1
      ====END====
      outside2
      =BEGIN=
        inside2
      ==END==
      outside3
    </main>
    

    :

    <main>
      outside1
      <section>
        inside1
      </section>
      outside2
      <section>
        inside2
      </section>
      outside3
    </main>
    
    推荐文章