2013-12-15 165 views
0

我有一个包含酒店信息的XML文件,我尝试使用XSL显示,但数据不显示在网页上(我没有HTML表格)。我在StackOverflow上阅读了很多帖子,但是我仍然看不到我的错误可能在哪里。XSL不显示HTML表格

我的XML文件的摘录:我的XSL代码

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

部分:

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

它看起来像你还没有宣布由在'entries'元素中使用的命名空间的前缀源XML,以便引用'entries/entry'不选择任何内容。全面查看这两份文件将会有所帮助。 –

回答

4

这里的问题是,因为命名空间几乎可以肯定。在你的XML中,第一行是:

<entries xmlns="http://ref.otcnice.com/webservice/" ... 

这里的xmlns=是一个命名空间声明。特别是它是默认命名空间的声明,意味着这个元素,并且所有后代元素(除非被重载)属于这个命名空间。

在您的XSLT中,您很可能没有声明任何名称空间。这意味着,当你这样做......

<xsl:for-each select="entries/entry"> 

它正在寻找进入元素不属于任何命名空间。这些与属于名称空间的元素不同,即使元素的实际名称相同。

如果您使用XSLT 2.0,你可以简单地设置XPath的默认名称空间财产,像这样

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://ref.otcnice.com/webservice/"> 

然后,XSLT将承担XPath表达式中引用的任何元素,这没” t有一个明确的命名空间前缀,将属于这个命名空间。

如果使用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" )