views:

15

answers:

2

i'm trying to implement an xsl file to an xml doc. however when i do so, it displays nothing. if i remove the reference of the xsl from the xml file, the data at least is displayed.

this is the xsl code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;

<xsl:template match="/">
<div>
    <div style="background:red;"><xsl:value-of select="title"/></div>
    <div style="background:green;"><p><xsl:value-of select="introduction"/></p></div>
    <div style="background:blue;"><xsl:for-each select="verse">
            <div><xsl:value-of select="p"/></div> <br />
            <div><xsl:value-of select="trla"/></div> <br />
            <div><xsl:value-of select="trli"/></div> <br />
            </xsl:for-each>
    </div>
</div>

</xsl:template>
</xsl:stylesheet>

the xml:

<root>
    <title></title>
    <introduction></introduction>
    <verse>
       <p></p>
       <trla></trla>
       <trli></trli>
    </verse>
</root>

and the html where the xml is being called through php:

<div id="display">
        <?php
        error_reporting(E_ALL);
        ini_set("display_errors", 1);

            $xmldoc = new DOMDocument();
            if(!file_exists('test.xml')){
              echo "Sorry this file does not exists!";
              exit();
            } else {
                $xmldoc->load('test.xml', LIBXML_NOBLANKS);


            $activities = $xmldoc->firstChild->firstChild;
            if($activities != null){
                    while($activities != null){
                                    ?>
                    <div id="xml">
                        <span>
                        <?php echo $activities->textContent ?> </li></ul></span> <br />

                    </div>
                                <?php
                                $activities = $activities->nextSibling;
                    }
                }
            }
         ?>
    </div>
+1  A: 

First off, there is no data in any of the nodes, so I would expect nothing to be displayed when value-of is called on them.

In addition, your template only matches the root element, you need to explicitly call the element with the name root, either in the template declaration, or the different selects.

Change the match rule to <xsl:template match="/root">.

Alternatively, the following will also work (provided you have data in the relevant nodes):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;

<xsl:template match="/">
<div>
    <div style="background:red;"><xsl:value-of select="root/title"/></div>
    <div style="background:green;"><p><xsl:value-of select="root/introduction"/></p></div>
    <div style="background:blue;"><xsl:for-each select="root/verse">
            <div><xsl:value-of select="p"/></div> <br />
            <div><xsl:value-of select="trla"/></div> <br />
            <div><xsl:value-of select="trli"/></div> <br />
            </xsl:for-each>
    </div>
</div>

</xsl:template>
</xsl:stylesheet>
Oded
tried your suggestion. somehow it didn't work even when i explicitly called the element with the name `root`. the nodes are not empty.
fuz3d
Oded
thanks, it worked. i must have been missing something.
fuz3d
+1  A: 

That's because inside the template the context node is the document root. Change the pattern matching to: match select="/*"

Alejandro
did that. still didn't work.
fuz3d