2013-12-15 3 views
0

У меня есть файл XML, содержащий информацию о гостиницах, которые я пытаюсь отобразить с помощью XSL, но данные не отображаются на веб-странице (у меня нет HTML-таблиц). Я прочитал много сообщений в StackOverflow, но я до сих пор не вижу, где моя ошибка.XSL не показывает таблицы HTML

Отрывок из моего файла 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> 
+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/"> 

(Приставка «о» здесь может быть на самом деле любой префикс, который вы выбрали, кстати. Это URI, который должен соответствовать XML).

Затем, когда вы хотите ссылаться на элемент в этом пространстве имен, вы должны добавить к нему префикс, чтобы указать пространство имен. Например,

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

(Не забудьте сделать «O: сайт», если вы используете XSLT 1.0")

Смежные вопросы