У меня есть следующий код 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>test@example.com</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);
?>
Этот код должен произвести "Привет мир", сопровождаемый "test@example.com", но почтовая часть не появляется. Какая-либо идея что случилось?
- Geoffrey Lee
Проблема в том, что предоставленный код XSLT имеет пространство имен по умолчанию.
Следовательно, элементы
,
и
находятся в пространстве имен xhtml. Но адрес электронной почты
упоминается без префикса в:
exsl: node-set ($ person) / email
XPath считает, что все имена без префикса находятся в «без пространства имен». Он пытается найти дочерний элемент exsl: node-set ($ person)
, вызванный адрес электронной почты
, который находится в «без пространства имен», и это безуспешно, поскольку его адрес электронной почты
] дочерний элемент находится в пространстве имен xhtml. Таким образом, узел электронной почты
не выбран и не выведен.
Решение :
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:x="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl x">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<html>
<p>Hello world</p>
<xsl:variable name="person">
<firstname>Foo</firstname>
<lastname>Bar</lastname>
<email>test@example.com</email>
</xsl:variable>
<xsl:text>
</xsl:text>
<xsl:value-of select="exsl:node-set($person)/x:email"/>
<xsl:text>
</xsl:text>
</html>
</xsl:template>
</xsl:stylesheet>
при применении к любому XML-документу (не используемому) дает желаемый результат :
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xhtml">
<p>Hello world</p>
test@example.com
</html>
Обратите внимание на :
Добавленный определение пространства имен с префиксом x
Измененный атрибут select
для
:
exsl: node-set ($ person) / x : email