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