我在某种程度上简化了问题,但我希望我仍然抓住了问题的本质。
假设我有以下简单的XML文件:
<main>
outside1
===BEGIN===
inside1
====END====
outside2
=BEGIN=
inside2
==END==
outside3
</main>
然后我可以使用以下XSLT 2.0:
<?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
以下是问题:
是否有更好的方法来匹配两个不同的正则表达式,而不是像上面所做的那样将它们嵌套在另一个中?
text()
中使用XSL模板匹配和转换正则表达式匹配吗?
显然,而不是:
<section/>
inside
<_section/>
我最终真正想要的是:
<section>
inside
</section>
那你怎么做?我不确定是否有可能在一个正则表达式匹配中打开一个元素并在另一个正则表达式中关闭它(即如果没有匹配的那个怎么办?结果将不是格式良好的XML!),但它看起来像这项任务非常典型,必须为他们提供惯用的解决方案。
注意:我们可以假设部分不会重叠,因此也不会嵌套。我们也可以假设它们总是以正确的对出现。
所以基本上我正在尝试完成Perl中的所有内容:
s/=+BEGIN=+/<section>/
s/=+END=+/<\/section>/
我正在寻找一种在XSLT中执行此操作的方法,因为:
text()
个节点)答案 0 :(得分:1)
此转化:
<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>
应用于提供的XML文档:
<main>
outside1
===BEGIN===
inside1
====END====
outside2
=BEGIN=
inside2
==END==
outside3
</main>
产生想要的结果:
<main>
outside1
<section>
inside1
</section>
outside2
<section>
inside2
</section>
outside3
</main>