2015-07-27 6 views
0

Я работаю над таблицей стилей, которая выводит HTML из XML-входов. Я должен генерировать различные уровни вложенности в выходном файле в соответствии с положением списка элементов на входе. Например, NEWS [1] и NEWS [2] должны быть вложены под одним и тем же элементом, а также в НОВОСТИ [3] и NEWS [4].XSLT - Динамическое вложение элементов

Это пример ввода XML:

<NEWS_LIST> 
    <NEWS> 
     <TITLE>Title of the notice #1</TILE> 
     <IMG_URL>http://media/image_1.png</IMG_URL> 
    </NEWS> 
    <NEWS> 
     <TITLE>Title of the notice #2</TILE> 
     <IMG_URL>http://media/image_2.png</IMG_URL> 
    </NEWS> 
    <NEWS> 
     <TITLE>Title of the notice #3</TILE> 
     <IMG_URL>http://media/image_3.png</IMG_URL> 
    </NEWS> 
    <NEWS> 
     <TITLE>Title of the notice #4</TILE> 
     <IMG_URL>http://media/image_4.png</IMG_URL> 
    </NEWS> 
</NEWS_LIST> 

Желаемая выход HTML:

<div class="middle> 
    <div class="unit 1"> 
     <div class="unit 2"> 
      <img src="http://media/image_1.png"/> 
      <p>Title of the notice #1</p> 
     </div> 
     <div class="unit 2"> 
      <img src="http://media/image_2.png"/> 
      <p>Title of the notice #2</p> 
     </div> 
    </div> 
    <div class="unit 1"> 
     <div class="unit 2"> 
      <img src="http://media/image_3.png"/> 
      <p>Title of the notice #3</p> 
     </div> 
     </div class="unit 2"> 
      <img src="http://media/image_4.png"/> 
      <p>Title of the notice #4</p> 
     </div> 
    </div> 
</div> 

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

ответ

1

Я предлагаю вам просмотреть NEWS узлы в два этапа:

    1. Первая фаза: Матч всех нечетные узлы позиции: <xsl:apply-templates select="NEWS[(position() mod 2)=1]" mode="unit1"/>

    ... и для каждого один, примените вторую фазу к ней и к следующей: <xsl:template match="NEWS" mode="unit1"> <div class="unit 1"> <xsl:apply-templates select="." mode="unit2"></xsl:apply-templates> <xsl:apply-templates select="following-sibling::NEWS[1]" mode="unit2"/> </ div> </xsl:template>

    1. Вторая фаза: печать каждого обрабатываемого узла. <xsl:template match="NEWS" mode="unit2"> <div class="unit 2"> <img src="{IMG_URL}" /> <p><xsl:value-of select="TITLE"/></p> </ div> </xsl:template>

Обратите внимание, что существует два шаблона, соответствующие NEWS, но они отличаются в mode (который является надлежащим для каждой фазы ).

+0

Хорошо, я не знал выражения «следующее братство». Большое вам спасибо, ваш ответ был действительно полезен. – BernatL

+0

Добро пожаловать. «Следующий сиблинг» является одним из XPath _axes_: направления, в которых может выполняться выражение: http://www.w3.org/TR/xpath/#axes –

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