XSLT转换为HTML - 转换时div为空

时间:2015-04-19 12:01:00

标签: xml xslt

我正在尝试使用以下XSLT文件将此XML转换为HTML。但由于某种原因,它不会填充#juices#smoothies div。 尝试过很多东西,看了一些例子,但仍然无法让它发挥作用。 很抱歉这么少的细节,但我不知道这里有什么问题。

任何帮助?

链接: XML XSL

2 个答案:

答案 0 :(得分:1)

这主要是命名空间问题。命名空间是XML中的基本概念。如果您不熟悉名称空间,请花些时间学习和理解它们。

您的输入XML具有默认命名空间<products xmlns="http://www.dcs.bbk.ac.uk/~rpedro02/ns/products">,这意味着所有元素都属于该命名空间,尽管它们没有命名空间前缀。如果您要定位特定命名空间中的元素,则XPath查询始终需要加前缀 - 查询不会继承默认命名空间。

在您的情况下,这意味着您需要使用前缀声明输入XML的默认命名空间,然后在引用输入XML文档中的任何元素时使用该前缀。这主要意味着更改<xsl:template match="/products/product">模板中的查询。

一些示例代码:声明这样的命名空间

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:prod="http://www.dcs.bbk.ac.uk/~rpedro02/ns/products" >

然后在您的查询中使用前缀prod,如下所示

<xsl:template match="/prod:products/prod:product">
    <div class="product">
        <img>
            <xsl:attribute name="alt">
                <xsl:value-of select="prod:name"/>
            </xsl:attribute>
            <xsl:attribute name="src">
                <xsl:value-of select="prod:picture"/>
            </xsl:attribute>
        </img>
        ...

答案 1 :(得分:0)

如果我改变了

,它就能正常工作
            <h1>Products</h1>
            <div id="juices" class="products">
                <h2>Juices</h2>
                <xsl:apply-templates select=".//*[local-name()='product' and @type='juice']" />
            </div>
            <div id="smoothies" class="products">
                <h2>Smoothies</h2>
                <xsl:apply-templates select=".//*[local-name()='product' and @type='smoothie']" />
            </div>

xpath没有捕获/ products / product [@type = ...] ..

并更改了与产品匹配的模板

<xsl:template match="./*[local-name()='product']">
    <div class="product">

检查xsl及其输出here