将虚拟包转换为php include

时间:2013-01-12 00:04:35

标签: xml xslt xml-parsing xslt-2.0

我正在尝试为评论进行模板匹配,以便它查找虚拟包含并将其转换为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]*&lt;!">
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes">&lt;?php&nbsp;</xsl:text> <xsl:value-of select="." /> <xsl:text disable-output-escaping="yes">&nbsp;?&gt;</xsl:text>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>

非常感谢任何帮助解决此问题。

1 个答案:

答案 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指令。