using xsl displays nothing
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">
<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>
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">
<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>
That's because inside the template the context node is the document root. Change the pattern matching to: match select="/*"
精彩评论