2010-06-01 9 views
9

में काम करने के लिए नोड-सेट मेरे पास निम्न PHP कोड है, लेकिन यह काम नहीं कर रहा है। मुझे कोई त्रुटि नहीं दिख रही है, लेकिन शायद मैं सिर्फ अंधेरा हूँ। मैं इसे PHP 5.3.1 पर चला रहा हूं।exsl प्राप्त करना: PHP

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

इस कोड को उत्पादन "हैलो दुनिया" "[email protected]" द्वारा पीछा किया जाना चाहिए, लेकिन ई-मेल भाग प्रकट नहीं होता है। कोई विचार क्या गलत है?

-Geoffrey ली

+0

अच्छा प्रश्न (+1)। स्पष्टीकरण और एक पूर्ण समाधान के लिए मेरा जवाब देखें। –

उत्तर

8

समस्या प्रदान की XSLT कोड एक डिफ़ॉल्ट नाम स्थान होता है।

इसलिए <firstname>, <lastname> और <email> तत्व xhtml नामस्थान में हैं।

exsl:node-set($person)/email 

XPath समझता है सब बिना उपसर्ग वाले नाम में "कोई नाम स्थान" होने के लिए: लेकिन email में किसी भी उपसर्ग के बिना संदर्भित है। यह exsl:node-set($person) के बच्चे को खोजने की कोशिश करता है जिसे email कहा जाता है जो "नो नेमस्पेस" में है और यह असफल है, क्योंकि इसका email बच्चा xhtml नेमस्पेस में है। इस प्रकार कोई email नोड चयनित और आउटपुट है।

समाधान:

यह परिवर्तन:

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

करें ध्यान दें:

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

जब किसी भी XML दस्तावेज़ (इस्तेमाल नहीं किया) पर लागू किया, वांछित परिणाम का उत्पादन:

  1. उपसर्ग x

  2. <xsl:value-of> का बदला select विशेषता के साथ जोड़ा नाम स्थान परिभाषा:

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

+0

आह, जो अब पूरी समझ में आता है। आपके लिखित उत्तर के लिए धन्यवाद! – geofflee

संबंधित मुद्दे