2013-08-27 5 views
0

У меня есть этот XML:Условный XSLT преобразование

<TreeView> 
    <Parent text="Installation"> 
    <child company="all" text="Startup" type="video" file="startup.mp4"/> 
    <child company="all" text="Getting there" type="video" file="small.mp4"/> 
    <child company="all" text="Steps" type="pdf_document" file="test.pdf"/> 
    <child company="all" text="Pictures" type="presentation" file="pics.ppx"/> 
    </Parent> 
    <Parent text="Usage"> 
    <child company="B" text="Tilbud pane" type="video" file="b1.mp4"/> 
    <child company="B" text="Report pane" type="pdf_document" file="b2.pdf"/> 
    <child company="N" text="Tilbud pane" type="video" file="n1.mp4"/> 
    <child company="N" text="Report pane" type="pdf_document" file="n2.pdf"/> 
    <child company="D" text="Tilbud pane" type="video" file="d1.mp4"/> 
    <child company="D" text="Report pane" type="pdf_document" file="d2.pdf"/> 
    </Parent> 
</TreeView> 

И это XSLT до сих пор:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="html" encoding="utf-8"/> 

    <xsl:template match="/"> 
     <ul id="LinkedList1" class="LinkedList"> 
     <xsl:apply-templates/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="Parent"> 
     <li> 
      <xsl:value-of select="@text"/> 
      <br/> 
      <ul> 
       <xsl:apply-templates select="child"/> 
      </ul> 
     </li> 
    </xsl:template> 

    <xsl:template match="child[@type='video']"> 
     <li> 
      <a href="{@file}" class="video"> 
      <img src="play_icon.png" alt="video" title="Video tutorial"/> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="@text"/> 
      </a> 
     </li> 
    </xsl:template> 
    <xsl:template match="child[@type='pdf_document']"> 
     <li> 
      <a href="{@file}" class="pdfdoc"> 
      <img src="pdf_icon.png" alt="pdfdoc" title="PDF Document"/> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="@text"/> 
      </a> 
     </li> 
    </xsl:template> 
    <xsl:template match="child[@type='presentation']"> 
     <li><a href="{@file}" class="presentation"> 
      <img src="powerpoint_icon.png" alt="presentation" title="Power Point presentation"/> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="@text"/> 
      </a> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

Он прекрасно работает, как задумано, но я хочу добавить еще один функция преобразования. Я хочу, в зависимости от значения атрибута , чтобы включить весь элемент или пропустить его.

Разработка: элементы по уходу за детьми, чьи стоимость компании атрибут «все» всегда должны быть включены в преобразованном файле. Впоследствии остальные элементы Child должны быть сгруппированы только в том случае, если они имеют, то есть компания значение атрибута «B». Тогда у меня будет 3 разных файла XSL для разных компаний. Поэтому мне нужен код XSL только для одной компании.

Я не уверен, должен ли я использовать условную инструкцию или шаблоны для этого. Я просто прослушиваю, потому что мой XSL-файл стал для меня «сложным».

Если кто-то может сделать дополнение с моими требованиями, к существующему коду - он будет весьма признателен.

+0

Здравствуйте Milknocookiez, вы можете добавить XPATH к вашему для фильтрации элементов: . Это даст вам только нужные элементы. Но как их группировать? Вы уже изучили это? С уважением, PEter – Peter

+0

@Peter - Спасибо. Они должны быть сгруппированы так же, как и раньше. Единственное дополнение, в котором я нуждаюсь, - это различие между атрибутом * company *. Итак, если атрибут ** все ** или ** B ** - они группируются, а остальные пропускаются. – Milkncookiez

ответ

1

Так что, если я использую этот исходный XML:

<TreeView> 
<Parent text="Installation"> 
    <child company="all" text="Startup" type="video" file="startup.mp4"/> 
    <child company="all" text="Getting there" type="video" file="small.mp4"/> 
    <child company="all" text="Steps" type="pdf_document" file="test.pdf"/> 
    <child company="all" text="Pictures" type="presentation" file="pics.ppx"/> 
</Parent> 
<Parent text="Usage"> 
    <child company="B" text="Tilbud pane" type="video" file="b1.mp4"/> 
    <child company="B" text="Report pane" type="pdf_document" file="b2.pdf"/> 
    <child company="N" text="Tilbud pane" type="video" file="n1.mp4"/> 
    <child company="N" text="Report pane" type="pdf_document" file="n2.pdf"/> 
    <child company="D" text="Tilbud pane" type="video" file="d1.mp4"/> 
    <child company="D" text="Report pane" type="pdf_document" file="d2.pdf"/> 
</Parent> 

и применить этот XSLT:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <ul id="LinkedList1" class="LinkedList"> 
     <xsl:apply-templates/> 
    </ul> 
</xsl:template> 

<xsl:template match="Parent"> 
    <li> 
     <xsl:value-of select="@text"/> 
     <br /> 
     <ul> 
      <xsl:apply-templates select="child[@company='all' or @company='B']"/> 
     </ul> 
    </li> 
</xsl:template> 

<xsl:template match="child[@type='video']"> 
    <li> 
     <a href="{@file}" class="video"> 
      <img src="play_icon.png" alt="video" title="Video tutorial"> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="@text"/> 
      </img> 
     </a> 
    </li> 
</xsl:template> 
<xsl:template match="child[@type='pdf_document']"> 
    <li> 
     <a href="{@file}" class="pdfdoc"> 
      <img src="pdf_icon.png" alt="pdfdoc" title="PDF Document"> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="@text"/> 
      </img> 
     </a> 
    </li> 
</xsl:template> 
<xsl:template match="child[@type='presentation']"> 
    <li> 
     <a href="{@file}" class="presentation"> 
     <img src="powerpoint_icon.png" alt="presentation" title="Power Point presentation"> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="@text"/> 
     </img> 
     </a> 
    </li> 
</xsl:template> 
</xsl:stylesheet> 

вы получите этот результат:

<ul class="LinkedList" id="LinkedList1"> 
<li>Installation<br/> 
    <ul> 
     <li> 
      <a class="video" href="startup.mp4"> 
       <img title="Video tutorial" alt="video" src="play_icon.png"> Startup</img> 
      </a> 
     </li> 
     <li> 
      <a class="video" href="small.mp4"> 
       <img title="Video tutorial" alt="video" src="play_icon.png"> Getting there</img> 
      </a> 
     </li> 
     <li> 
      <a class="pdfdoc" href="test.pdf"> 
       <img title="PDF Document" alt="pdfdoc" src="pdf_icon.png"> Steps</img> 
      </a> 
     </li> 
     <li> 
      <a class="presentation" href="pics.ppx"> 
       <img title="Power Point presentation" alt="presentation" 
        src="powerpoint_icon.png"> Pictures</img> 
      </a> 
     </li> 
    </ul> 
</li> 
<li>Usage<br/> 
    <ul> 
     <li> 
      <a class="video" href="b1.mp4"> 
       <img title="Video tutorial" alt="video" src="play_icon.png"> Tilbud pane</img> 
      </a> 
     </li> 
     <li> 
      <a class="pdfdoc" href="b2.pdf"> 
       <img title="PDF Document" alt="pdfdoc" src="pdf_icon.png"> Report pane</img> 
      </a> 
     </li> 
    </ul> 
</li> 
</ul> 

Рассмотрим в <xsl:output indent="yes" omit-xml-declaration="yes"/> в таблицы стилей. В вашей исходной таблице стилей есть output=html, что приводит к тому, что ваши элементы <br/> «теряют» закрывающий тег.

Я надеюсь, что выход будет таким, как вы ожидаете.

С наилучшими пожеланиями, Питер

+0

Это работает как волшебство! Благодарю. Я просто не понял эту часть с '
', теряя свой закрывающий тег. Что происходит, когда они «теряют» его? – Milkncookiez

+0

В соответствии со стандартами XHTML каждому тегу нужен закрытый тег или самозакрывающийся тег. Чтобы быть в безопасности, я всегда был уверен, что у br-элемента есть самозакрывающийся тег. С наилучшими пожеланиями, Питер – Peter