Exsl Başlarken: düğüm-set PHP çalışmak

1 Cevap php

Ben şu PHP kodu var, ama işe yaramıyor. Ben herhangi bir hata görmüyorum, ama belki ben sadece körüm. PHP 5.3.1 Bu koşuyorum.

<?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);
?>

Bu kod çıktı "Merhaba dünya" "test@example.com" tarafından takip edilmelidir, ancak e-posta kısmı görünmüyor. Herhangi bir fikir sorun ne?

-Geoffrey Lee

1 Cevap

The problem is that the provided XSLT code has a default namespace.

Bu yüzden, <firstname>, <lastname> ve <email> elemanları XHTML ad bulunmaktadır. Ama email herhangi bir önek olmadan başvurulmaktadır:

exsl:node-set($person)/email

XPath tüm öneksiz isimler "hiçbir ad" olmak görmektedir. Bu exsl:node-set($person) denilen bir çocuğu bulmaya çalışır email bu "hiçbir ad" olduğunu ve onun email çocuk xhtml ad olduğundan bu, başarısız olur. Bu nedenle herhangi bir email düğümü seçilir ve çıkış edilir.

Solution:

Bu dönüşüm:

<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>

when applied on any XML document (not used), produces the wanted result:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xhtml">
   <p>Hello world</p>
test@example.com
</html>

Do note:

  1. Prefix x ile eklenen ad tanımı

  2. Of değiştirildi select niteliği <xsl:value-of>,

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