Быть exsl:node-принятым-за-работу в 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>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

9
задан geofflee 1 June 2010 в 12:48
поделиться

1 ответ

Проблема в том, что предоставленный код 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>&#xA;</xsl:text>
     <xsl:value-of select="exsl:node-set($person)/x:email"/>
     <xsl:text>&#xA;</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>

Обратите внимание на :

  1. Добавленный определение пространства имен с префиксом x

  2. Измененный атрибут select для :

exsl: node-set ($ person) / x : email

8
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: