让 exsl:node-set 在 PHP 中工作
我有以下 PHP 代码,但它不起作用。我没有看到任何错误,但也许我只是盲目的。我在 PHP 5.3.1 上运行它。
<?php
$xsl_string = <<<HEREDOC
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="/">
<p>Hello world</p>
<xsl:variable name="person">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<email>[email protected]</email>
</xsl:variable>
<xsl:value-of select="exsl:node-set(\$person)/email"/>
</xsl:template>
</xsl:stylesheet>
HEREDOC;
$xml_dom = new DOMDocument("1.0", "utf-8");
$xml_dom->appendChild($xml_dom->createElement("dummy"));
$xsl_dom = new DOMDocument();
$xsl_dom->loadXML($xsl_string);
$xsl_processor = new XSLTProcessor();
$xsl_processor->importStyleSheet($xsl_dom);
echo $xsl_processor->transformToXML($xml_dom);
?>
此代码应输出“Hello world”,后跟“[email protected]” ,但电子邮件部分不会出现。知道出了什么问题吗?
——杰弗里·李
I have the following PHP code, but it's not working. I don't see any errors, but maybe I'm just blind. I'm running this on PHP 5.3.1.
<?php
$xsl_string = <<<HEREDOC
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="/">
<p>Hello world</p>
<xsl:variable name="person">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<email>[email protected]</email>
</xsl:variable>
<xsl:value-of select="exsl:node-set(\$person)/email"/>
</xsl:template>
</xsl:stylesheet>
HEREDOC;
$xml_dom = new DOMDocument("1.0", "utf-8");
$xml_dom->appendChild($xml_dom->createElement("dummy"));
$xsl_dom = new DOMDocument();
$xsl_dom->loadXML($xsl_string);
$xsl_processor = new XSLTProcessor();
$xsl_processor->importStyleSheet($xsl_dom);
echo $xsl_processor->transformToXML($xml_dom);
?>
This code should output "Hello world" followed by "[email protected]", but the e-mail portion doesn't appear. Any idea what's wrong?
-Geoffrey Lee
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题在于提供的 XSLT 代码具有默认命名空间。
因此,
、
和
元素位于 xhtml 命名空间中。但是email
的引用没有任何前缀:XPath 认为所有无前缀的名称都位于“无命名空间”中。它尝试查找位于“无命名空间”中的名为
email
的exsl:node-set($person)
子级,但这是不成功的,因为它的email
child 位于 xhtml 命名空间中。因此没有email
节点被选择和输出。解决方案:
此转换:
当应用于任何 XML 文档(未使用)时,会产生所需的结果:
请注意:
添加的带有前缀
x
的命名空间定义
更改后的
select
属性xsl:value-of>:exsl:node-设置($person)/x:电子邮件
The problem is that the provided XSLT code has a default namespace.
Therefore, the
<firstname>
,<lastname>
and<email>
elements are in the xhtml namespace. Butemail
is referenced without any prefix in:XPath considers all unprefixed names to be in "no namespace". It tries to find a child of
exsl:node-set($person)
calledemail
that is in "no namespace" and this is unsuccessful, because itsemail
child is in the xhtml namespace. Thus noemail
node is selected and output.Solution:
This transformation:
when applied on any XML document (not used), produces the wanted result:
Do note:
The added namespace definition with prefix
x
The changed
select
attribute of<xsl:value-of>
:exsl:node-set($person)/x:email