XSL不显示HTML表

时间:2013-12-15 15:15:23

标签: html xml xslt

我有一个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>

1 个答案:

答案 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”)