在我的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中,但我试图避免这种情况......直到有人告诉我没有别的办法。
谢谢!
答案 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转换:
博客文章[虽然用德语]更详细地描述了这里: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 。