xsl extension php xml xslt exslt

extension - php xsl



Obteniendo exsl: node-set para trabajar en PHP (1)

Tengo el siguiente código PHP, pero no está funcionando. No veo ningún error, pero tal vez estoy solo ciego. Estoy ejecutando esto en 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); ?>

Este código debería mostrar "Hello world" seguido de "[email protected]", pero la parte del correo electrónico no aparece. ¿Alguna idea de lo que está mal?

-Geoffrey Lee


El problema es que el código XSLT provisto tiene un espacio de nombre predeterminado.

Por lo tanto, los elementos <firstname> , <lastname> y <email> están en el espacio de nombres xhtml. Pero el email se referencia sin ningún prefijo en:

exsl:node-set($person)/email

XPath considera que todos los nombres no prefijados están en "sin espacio de nombres". Intenta buscar un hijo de exsl:node-set($person) llamado email que está en "sin espacio de nombres" y esto no tiene éxito, porque su hijo de email está en el espacio de nombres xhtml. Por lo tanto, no se selecciona ningún nodo de email y se genera.

Solución :

Esta transformación:

<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>[email protected]</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>

cuando se aplica en cualquier documento XML (no utilizado), produce el resultado deseado :

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xhtml"> <p>Hello world</p> [email protected] </html>

Nota :

  1. La definición del espacio de nombres agregado con el prefijo x

  2. El atributo de select cambiado de <xsl:value-of> :

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