Вложенные циклы не работают правильно для xslt - PullRequest
0 голосов
/ 07 сентября 2010

Я использую CMS, которая называется Umbraco (umbraco.org), и для отображения флеш-новостей на веб-сайте с помощью продукта SlideShowPro Standalone (www.slideshowpro.net)

Вкратце я создал раздел на панели администратора следующим образом.

-Flash (файл xslt)
- Название месяца
- узел с изображением
- узел с видео

Каждый месяц я буду создавать узел с названием месяца и добавлять к ним изображения и видео. Узел месяца может иметь все изображения или видео, возможно, оба смешаны. У меня нет входного XML-файла, потому что в SlideShowPro Standalone есть только файл, который выводит желаемый XML-файл для flash

вот XML-файл:

<album id="ssp" lgPath="" tnPath="" title="Album One" description="" tn="">
    <img src="1.jpg" id="id1" title="" caption="" link="" target="_blank" pause="" />
    <img src="1.f4v" id="id1" tn="" title="" caption="" link="" target="_blank" pause="" vidpreview" />
</album>

То, что я сделал в файле xslt:

<xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']">
            <album lgPath="http://localhost" tnPath="http://localhost" title="{data[@alias = 'albumTitle']}" description="{data[@alias = 'albumDescription']}" tn="http://localhost">
                <xsl:for-each select="node">
                    <xsl:if test = "string-length(./data [@alias = 'image']) &gt; 0" >                                                  
                                                <img src="{data[@alias = 'image']}" title="{data[@alias = 'title']}" caption="{data[@alias = 'caption']}" link="{data[@alias = 'link']}" target="_blank" pause=""/>                                                         
                    </xsl:if>       
                    <xsl:if test = "string-length(./data [@alias = 'video']) &gt; 0" >                                                  
                                                <img src="{data[@alias = 'video']}" tn="http://localhost" title="{data[@alias = 'title']}" caption="{data[@alias = 'caption']}" link="{data[@alias = 'link']}" target="_blank" pause="" vidpreview="/flash/gallery/album2/video/1_preview.png"/>                                                        
                    </xsl:if>

                </xsl:for-each>     
                        </album>
        </xsl:for-each>

и что выводит

<album lgPath="http://localhost" tnPath="http://localhost" title="" description="" tn="http://localhost"><img src="/media/951/untitled.png" title="örnek" caption="örnek" link="" target="_blank" pause=""/><img src="/media/1026/1.f4v" title="flash" caption="flash" link="" target="_blank" pause=""/></album>

Несмотря на то, что Ларш указал, что я должен использовать утверждение, результат тот же ...

Ответы [ 3 ]

1 голос
/ 07 сентября 2010

Я не уверен, на что похожи ваши исходные данные, но при условии, что они не имеют вложенных элементов, проблема в том, что второй xsl: for-each должен быть

<xsl:for-each select=".">

поскольку элемент контекста внутри первого элемента for-each будет элементом , поэтому отправленная вами инструкция будет искать дополнительный дочерний элемент.

0 голосов
/ 07 сентября 2010

ОБНОВЛЕНИЕ : @deniz_seaside, пожалуйста, дайте нам документ XML и также посмотрите его в первый раз.

Тогда, возможно, вы снова напишите свое преобразование, на этот раз оченьлучше.

Вот как получить XML-документ, которого у вас нет : просто примените это преобразование к этому неизвестному документу:

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Или еще короче :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

<xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']"> 
            <album lgPath="http://localhost" tnPath="http://localhost" title="{data[@alias = 'albumTitle']}" description="{data[@alias = 'albumDescription']}" tn="http://localhost"> 
                <xsl:for-each select="node"> 

Второй <xsl:for-each>, скорее всего, неверен.Он выберет для обработки все узлы с именем node текущего узла, который также называется node.Обычно узел с именем node также не имеет дочерних элементов с именем node.

Решение состоит в том, чтобы удалить вторую инструкцию <xsl:for-each> и оставить ее содержимое (тело) в теле первого <xsl:for-each> инструкция.

Примечание :

  1. Поскольку вы не предоставили никакого исходного XML-документа, скорее всего, ваша проблемаиз-за плохой погоды .

  2. Никогда не используйте имя node для элемента, атрибута или инструкции обработки.Вы увеличиваете вероятность путаницы и ошибок в 1000 раз.

0 голосов
/ 07 сентября 2010

Nasılsınız?!

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

В то же время, мне интересно, возможно ли, чтобы элемент <node> имел оба элемента

<data alias="image">

ребенок и a

<data alias="video">

ребенок? Если это так, это объясняет, почему в этих случаях вы не получаете вывод <img src="{data[@alias = 'video']}">.

Инструкция <xsl:choose> будет «выполнять» только одну из инструкций <xsl:when> каждый раз, когда обрабатывается <xsl:choose> (в данном случае, один раз для каждой итерации цикла <xsl:for-each>). Поэтому, если есть `data [@aliasIf, если вам нужно обрабатывать как дочерние данные изображения, так и дочерние данные видео, используйте

<xsl:if test=...>

для каждого из них вместо

<xsl:choose>
  <xsl:when test=...>

Если это не решает проблему, пожалуйста, опубликуйте образец вашего входного XML и отформатируйте его с помощью кнопки форматирования кода (со значком 101 010).

...