假设我有以下简单的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>/