在PHP中动态生成的XML上使用XSLT document()

时间:2010-10-16 16:22:53

标签: php xml xslt

在我的XSLT文件中。我使用document()函数

<xsl:variable name="Publicity" select="document('./publicity.xml')" />

并且可行,但如果我尝试链接动态生成XML的PHP​​脚本,

<xsl:variable name="Publicity" select="document('./publicity.php')" />

我得到了

Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: file:///C:/wamp/www/XSLT/test.php:3: parser error : Start tag expected, '<' not found in ... on line ...

其中包含来自<

<?php

看起来XSLTProcessor没有通过HTTP请求请求文件,所以它不是由Apache / PHP执行的。

我知道我可以简单地将XML结构包含在我的主XML中,但我试图避免这种情况......直到有人告诉我没有别的办法。

谢谢!

4 个答案:

答案 0 :(得分:3)

right()函数只是从磁盘读取文件,它不会发出HTTP请求。所以PHP不会执行。

您必须使用URL而不仅仅使用文件名作为document()函数的参数。

<xsl:variable name="Publicity" 
     select="document('http://example.com/publicity.php')" />

我认为以这种方式使用URL是大多数XSLT处理器中的常见功能,但我没有使用PHP进行测试,因此您的里程可能会有所不同。

答案 1 :(得分:1)

由于我在寻找类似问题的解决方案时,在着名的搜索引擎的帮助下偶然发现了这篇文章,这是我到目前为止所发现的。我的目标是有一个layout.xml文件,其中包含一些XHTML布局,并使用PHP生成的data.xml树中的数据填充它(但不是通过XSL转换保存到磁盘)。

似乎您不能直接在XSLT文件中导入动态生成的XML而不将其保存在磁盘上或将其包含在XSL树中。解决方案似乎是在data.xml上使用两个xsl转换:

  1. 通过php生成包含数据的data.xml。
  2. 然后使用XSL转换生成XML,将您的data.xml转换为data.xsl(第一次转换) - data.xsl需要如此结构化以根据需要将其数据应用于layout.xml(请参阅下一步)
  3. 在layout.xml上使用data.xsl来填充数据(第二次转换)。
  4. 博客文章[虽然用德语]更详细地描述了这里:xsl als Templatesystem

    这可能有点作弊,因为您的data.xsl是包含数据结构的原始XSL的变体。但是,它似乎更优雅,因为您可能可以创建一个通用的first-transformation-xsl文件(只需要将其保存到磁盘一次)并重新使用它。我还不知道是否有优化空间,因为到目前为止我还没有使用过XSLT。

答案 2 :(得分:1)

通过简单地使用CURL获取XML(静态或动态),我使用xslt document()函数和php取得了成功。所以我的URL是一个PHP脚本(代理),它在某处CURLs一个XML资源。获得RSS格式的XML文档

这样的东西
<xsl:variable name="homeUrl" select="http://mydomain.tld/"/>
<xsl:variable name="xmlUrl" select="http://domain.tld/feed.rss"/>
<xsl:variable name="includeXML" select="document(concat($homeUrl,'api/proxy.php?url=',$xmlUrl))"/>

<xsl:for-each select="$includeXML/rss/channel/item">
    ...

答案 3 :(得分:0)

如果 the document() 函数的第一个参数是相对URI,则从第二个参数的base-uri解析。如果没有第二个参数,则使用包含对document()函数的调用的XSLT样式表的基URI。

以下摘自 W3C XSLT spec 。:

  

“URI引用可能是相对的。   基本URI(参见[3.2基本URI])   第二个参数中的节点   在文档中第一个的节点集   order用作基本URI   将相对URI解析为   绝对URI。如果第二个参数   省略,然后它默认为   包含样式表的节点   包含调用的表达式   到文档功能。注意一个   零长度URI引用是一个   参考相关的文件   URI引用所在的位置   解决;因此文件(“”)指的是   样式表的根节点;该   样式表的树表示   与XML完全相同   包含样式表的文档是   最初的源文件。“

当XSLT样式表确实有URI(文件url或http url)时,这很有效。但是,动态生成的样式表在内存中,没有基URI。在这种情况下,无法成功解析作为document()函数的第一个也是唯一参数的相对URI。

解决方案是提供XML文档的完整(绝对)URI