【问题标题】:using xsl displays nothing使用 xsl 什么都不显示
【发布时间】:2010-07-30 14:38:48
【问题描述】:

我正在尝试将 xsl 文件实现为 xml 文档。但是,当我这样做时,它什么也不显示。如果我从 xml 文件中删除 xsl 的引用,则至少会显示数据。

这是 xsl 代码:

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

xml:

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

以及通过php调用xml的html:

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

【问题讨论】:

    标签: php xml xslt formatting domdocument


    【解决方案1】:

    首先,任何节点中都没有数据,所以我希望在它们上调用value-of 时不会显示任何内容。

    另外,你的模板只匹配根元素,你需要显式调用名称为root的元素,要么在模板声明中,要么在不同的选择中。

    将匹配规则更改为&lt;xsl:template match="/root"&gt;

    或者,以下方法也可以使用(前提是相关节点中有数据):

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

    【讨论】:

    • 尝试了您的建议。不知何故,即使我明确地调用名称为root 的元素,它也不起作用。节点不为空。
    • @fuz3d - 我在这里测试了你的 XML(带数据)和我的 xsl:w3schools.com/xsl/…
    【解决方案2】:

    这是因为在模板内部,上下文节点是文档根。将模式匹配改为:match select="/*"

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多