2015-04-19 3 views
-2

Я пытаюсь преобразовать этот XML в HTML, используя следующий файл XSLT. Но по какой-то причине он не заселяет #juices и #smoothies divs. Пробовал много вещей, видел несколько примеров, но до сих пор не удается заставить это работать. Извините за столь небольшое количество деталей, но я не знаю, что здесь не так.XSLT to HTML - div пустой при преобразовании

Любая помощь?

Ссылки: XML XSL

+0

Может быть, вы какой-то код? – Azat

+0

Проверьте ссылки на вопрос. Слишком долго вставлять сюда. – rjpedrosa

+0

Пример ввода XML –

ответ

1

Это, главным образом, проблема с пространством имен. Пространства имен являются фундаментальной концепцией в XML. Если вы не знакомы с пространствами имен, пожалуйста, найдите время, чтобы узнать и понять их.

Ваш вход XML имеет пространство имен по умолчанию <products xmlns="http://www.dcs.bbk.ac.uk/~rpedro02/ns/products">, что означает, что все элементы принадлежат этому пространству имен, хотя они не имеют префикса пространства имен. Запросы XPath всегда должны быть префиксными, если вы нацеливаете элементы в определенном пространстве имен - запросы не наследуют пространство имен по умолчанию.

В вашем случае это означает, что вам нужно объявить пространство имен по умолчанию вашего входного XML с префиксом, а затем использовать этот префикс при обращении к любым элементам вашего входного документа XML. В основном это означает изменение запросов в шаблоне <xsl:template match="/products/product">.

Некоторые примеры кода: декларирует пространство имен, как этот

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:prod="http://www.dcs.bbk.ac.uk/~rpedro02/ns/products" > 

, а затем использовать префикс prod в запросах как этот

<xsl:template match="/prod:products/prod:product"> 
    <div class="product"> 
     <img> 
      <xsl:attribute name="alt"> 
       <xsl:value-of select="prod:name"/> 
      </xsl:attribute> 
      <xsl:attribute name="src"> 
       <xsl:value-of select="prod:picture"/> 
      </xsl:attribute> 
     </img> 
     ... 
+0

Большое спасибо! Теперь я понимаю! Просто быстрый вопрос: как префикс атрибутов?Как и здесь: '' – rjpedrosa

+0

Пространство имен по умолчанию не применяется к атрибутам без префикса, поэтому нет необходимости использовать с ними префикс пространства имен. В этом случае ваша проблема отличается, вы запрашиваете атрибут 'label' элемента' ', но атрибут принадлежит его дочерним элементам. Вместо этого используйте ''. – jasso

+0

Да, заметил, что после публикации комментария и решил сам. Но еще раз спасибо. Мысль '' означала "для каждого из элементов ", но нет. Это проблема использования foreach в массивах на языках программирования. :П – rjpedrosa

0

это работает, если я меняя

  <h1>Products</h1> 
      <div id="juices" class="products"> 
       <h2>Juices</h2> 
       <xsl:apply-templates select=".//*[local-name()='product' and @type='juice']" /> 
      </div> 
      <div id="smoothies" class="products"> 
       <h2>Smoothies</h2> 
       <xsl:apply-templates select=".//*[local-name()='product' and @type='smoothie']" /> 
      </div> 

XPath не улавливает/продукты/продукт [@ типа = ...] ..

и изменил шаблон, соответствующий продукции

<xsl:template match="./*[local-name()='product']"> 
    <div class="product"> 

Проверьте xsl и его вывод here

+0

Теперь он оценивает и усваивает эти условия. Но он неправильно применяет шаблоны. Кажется, он превращается в простой текст без HTML-тегов. Любая дополнительная помощь? Извините, новичок здесь. – rjpedrosa

+0

получение этой ошибки: E [Saxon6.5.5] Ошибка в выражении ./*[local-name()='product ']: Неожиданный токен в шаблоне, найден. – rjpedrosa

+0

Теперь он «печатает» теги, но они пустые. Это убивает меня ...: S – rjpedrosa

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