2013-12-15 106 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" )