我有一个XML文件,其中包含我尝试使用XSL显示的酒店信息,但数据未在网页上显示(我没有HTML表格)。我在StackOverflow上阅读了很多帖子,但我仍然看不出我的错误。
我的XML文件的摘录:
<entries xmlns="http://ref.otcnice.com/webservice/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:SchemaLocation="http://ref.otcnice.com/webservice/entries.xsd">
<entry>
<ID>1021</ID>
<name_fr>AC BY MARRIOTT NICE</name_fr>
<name_fr_short>AC BY MARRIOTT NICE</name_fr_short>
<address>
<address_line1>59 Promenade des Anglais</address_line1>
<address_line2/>
<address_line3/>
<zip>06000</zip>
<city>NICE</city>
</address>
<phone>+33 (0)4 93 97 90 90</phone>
</entry>
<!--.........-->
</entries>
我的部分XSL代码:
<table class="table table-bordered table-hover table-striped">
<tr>
<th>Nom</th>
<th width='380'>Adresse</th>
<th width='175'>Téléphone</th>
<th>Site Web</th>
</tr>
<xsl:for-each select="entries/entry">
<tr>
<td>
<xsl:element name="a">
<xsl:attribute name="href">/ProjetMiage/detail /?id=<xsl:value-of select="ID"/>
</xsl:attribute>
<xsl:attribute name="target">detail
</xsl:attribute>
<xsl:value-of select="name_fr"/>
</xsl:element>
</td>
<td>
<xsl:value-of select="address"/>
</td>
<td>
<xsl:value-of select="phone"/>
</td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="website"/>
</xsl:attribute>
<xsl:attribute name="target">
blank
</xsl:attribute>
<xsl:value-of select="website"/>
</xsl:element>
</td>
</tr>
</xsl:for-each>
</table>
答案 0 :(得分:4)
这里的问题几乎可以肯定是因为名称空间。在XML中,第一行如下:
<entries xmlns="http://ref.otcnice.com/webservice/" ...
这里的xmlns=
是名称空间声明。特别是,它是默认命名空间的声明,表示此元素,并且所有后代元素(除非被覆盖)属于此命名空间。
在您的XSLT中,您很可能没有声明任何命名空间。这意味着当你这样做......
<xsl:for-each select="entries/entry">
正在寻找属于NO命名空间的条目和条目元素。它们与属于命名空间的元素不同,即使元素的实际名称相同。
如果您使用的是XSLT 2.0,则只需设置 xpath-default-namespace 属性,就像这样
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://ref.otcnice.com/webservice/">
然后,XSLT会假设xpath表达式中引用的任何元素都没有显式的名称空间前缀,属于这个名称空间。
如果您使用的是XSLT 1.0,则必须声明命名空间以及前缀
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:o="http://ref.otcnice.com/webservice/">
(顺便说一句,前缀“o”实际上可以是您选择的任何前缀。它是必须与XML匹配的URI。)
然后,只要您想引用此命名空间中的元素,就可以为其添加前缀,以指示命名空间。例如
<xsl:for-each select="o:entries/o:entry">
<xsl:value-of select="o:website"/>
顺便说一下,你的XSLT非常冗长。而不是写这个......
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="website"/>
</xsl:attribute>
<xsl:attribute name="target">
blank
</xsl:attribute>
<xsl:value-of select="website"/>
</xsl:element>
你可以改为编写这个(注意使用花括号{ }
来表示要计算的表达式,而不是字面输出)。
<a href="{website}" target="_blank">
<xsl:value-of select="website" />
</a>
(如果您使用的是XSLT 1.0,请不要忘记“o:website”)