我正在尝试为评论进行模板匹配,以便它查找虚拟包含并将其转换为php include:
<node>
<!--#include virtual="/abc/contacts.html" -->
<!-- some random comment -->
</node>
到
<node>
<?php include($_SERVER[DOCUMENT_ROOT]."/abc/contacts.html"); ?>
<!-- some random comment -->
</node>
我正在尝试做类似的事情:
<xsl:template match="comment()" >
<xsl:analyze-string select="." regex="^[\s\S]*<!">
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes"><?php </xsl:text> <xsl:value-of select="." /> <xsl:text disable-output-escaping="yes"> ?></xsl:text>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
非常感谢任何帮助解决此问题。
答案 0 :(得分:1)
您不需要XSLT 2.0 :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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=
"comment()[starts-with(normalize-space(),'#include virtual=')]">
<xsl:processing-instruction name="php">
<xsl:text>include($_SERVER[DOCUMENT_ROOT].</xsl:text>
<xsl:value-of select=
"substring-after(normalize-space(),'#include virtual=')"/>
<xsl:text>);</xsl:text>
</xsl:processing-instruction>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<node>
<!--#include virtual="/abc/contacts.html" -->
<!-- some random comment -->
</node>
产生了想要的正确结果:
<node>
<?php include($_SERVER[DOCUMENT_ROOT]."/abc/contacts.html");?>
<!-- some random comment -->
</node>
<强>解释强>:
正确使用 identity rule ,模板匹配模式,XPath函数 normalize-space()
和 starts-with()
,以及 xsl:processing-instruction
XSLT指令。