XSL не показывает таблицы HTML

0

У меня есть файл 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>
  • 5
    Похоже , что вы не объявили префикс пространства имен , используемых entries элемента в исходном XML, так что ссылки на entries/entry не выберет ничего. Просмотр обоих документов в полном объеме был бы полезен.
Теги:
xslt

1 ответ

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" здесь может фактически быть любым префиксом, который вы выбрали, между прочим. Это 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: website", если вы используете XSLT 1.0 ")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню