我正在尝试开发一个可以在xsl样式表中检测递归模板调用的正则表达式。
到目前为止,它还没有真正成功。
在下面的代码中,我需要检测模板B是否递归调用:
<xsl:template name="A">
blah blha ?!@#?%$#^%?*?&(({}:"><;'[]\/.,./'
<xsl:call-template name="B">
blah blah
</xsl:template>
<xsl:template name="B">
blah blha
<xsl:call-template name="B">
blah blah
</xsl:template>
<xsl:template name="C">
blah blha
<xsl:call-template name="B">
blah blah
</xsl:template>
在这种特定情况下,reg ex是可以的。
如果我删除了对B的第二次调用,则正则表达式匹配最后一次对B的调用。这不应该发生。
(<xsl:template name=\"(?<templateName>\w+)\">.*?(?<=<xsl:call-template name=\"\k<templateName>\">).*?</xsl:template>)+
我不是正则表达的大师。欢迎任何帮助。
谢谢。
答案 0 :(得分:8)
重申一个明显的观点:不要尝试使用正则表达式解析XML或其他非常规语言。请。
使用XML解析器并查看生成的树。您可以创建模板调用的图表并查找其中的周期。应该是一个更强大的解决方案,而不是试图与正则表达式一起破解它。通过这种方式,您还可以检测到模板A可能调用模板B,模板B调用模板C并再次调用模板A.这种类型的递归对于您当前的方法是不可见的(如果它可以被说服起作用)。