2010-05-11 5 views
3

У меня есть документ XML с перечисленными в нем компаниями. Я хочу создать ссылку с XSLT, которая содержит дочерний элемент <link> следующего узла. Извините, если это confusing..here некоторый образец XML, что я пытаюсь получить:Ссылка на элемент в другом узле (XSLT)

<portfolio> 

<company> 
<name>Dano Industries</name> 
<link>dano.xml</link> 
</company> 

<company> 
<name>Mike and Co.</name> 
<link>mike.xml</link> 
</company> 

<company> 
<name>Steve Inc.</name> 
<link>steve.xml</link> 
</company> 

</portfolio> 

Я хочу две ссылки, «Назад» и «NEXT». Пока в настоящее время на mike.xml, я хочу, чтобы BACK ссылался на «dano.xml» и NEXT, связанный с «steve.xml» ... и т. Д. И динамически изменял его на другой странице на основе узлов вокруг него. Я хочу сделать это, потому что я могу добавить и изменить список по мере продвижения, так что я не хочу, чтобы вручную переустанавливать все.

Как я могу получить это? Извините, что я новичок в XSLT, поэтому, пожалуйста, объясните с помощью решения, если это возможно! Заранее спасибо!

+0

Хороший вопрос (+1). См. Мой ответ для полного решения. :) –

ответ

1

Основываясь на ваших комментариях к Dimitre, я думаю, что вам нужно будет использовать функцию document() для доступа к XML-файлу «основного списка».

Что вы на самом деле запускаете таблицу стилей, это отдельные фрагменты (dano.xml, mike.xml, steve.xml), правильно?

Я использую пример «mike.xml» для примера. Я не знаю, как выглядят фрагменты, поэтому я должен был сделать это. Вы должны будете иметь возможность идентифицировать правильный <company> в главном списке на основе чего-то во фрагменте. В моем примере фрагмент имеет элемент <compName> с тем же значением, что и элемент <name> в соответствующей компании в основном XML-списке.

Вот что "главный список" XML, "Дано/микрофон/стив" XML, таблицы стилей, и результирующий HTML выглядит следующим образом:

master_list.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<portfolio> 

    <company> 
     <name>Dano Industries</name> 
     <link>dano.xml</link> 
    </company> 

    <company> 
     <name>Mike and Co.</name> 
     <link>mike.xml</link> 
    </company> 

    <company> 
     <name>Steve Inc.</name> 
     <link>steve.xml</link> 
    </company> 

</portfolio> 

dano.xml

<?xml version="1.0" encoding="UTF-8"?> 
<fragment> 
    <compName>Dano Industries</compName> 
    <compInfo>Some info about Dano Industries</compInfo> 
</fragment> 

mike.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<fragment> 
    <compName>Mike and Co.</compName> 
    <compInfo>Some info about Mike and Co.</compInfo> 
</fragment> 

steve.XML

<?xml version="1.0" encoding="UTF-8"?> 
<fragment> 
    <compName>Steve Inc.</compName> 
    <compInfo>Some info about Steve Inc.</compInfo> 
</fragment> 

таблица стилей:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="fragment"> 
     <xsl:variable name="name" select="compName"/> 
     <xsl:variable name="previous-file"> 
     <xsl:value-of select="document('master_list.xml')/portfolio/company[name=$name]/preceding-sibling::company[1]/link"/> 
     </xsl:variable> 
     <xsl:variable name="next-file"> 
     <xsl:value-of select="document('master_list.xml')/portfolio/company[name=$name]/following-sibling::company[1]/link"/> 
     </xsl:variable> 
     <html> 
     <xsl:apply-templates/> 
     <p> 
      <xsl:if test="not($previous-file='')"> 
       <a href="{$previous-file}">Back</a> 
      </xsl:if> 
      <xsl:if test="not($previous-file='') and not($next-file='')"> 
       <xsl:text>&#xA0;|&#xA0;</xsl:text> 
      </xsl:if> 
      <xsl:if test="not($next-file='')"> 
       <a href="{$next-file}">Next</a> 
      </xsl:if> 
     </p> 
     </html> 
    </xsl:template> 

    <xsl:template match="compName"> 
     <h1><xsl:apply-templates/></h1> 
    </xsl:template> 

    <xsl:template match="compInfo"> 
     <p><xsl:apply-templates/></p> 
    </xsl:template> 

</xsl:stylesheet> 

HTML для Дано (dano.htm :)

<html> 
    <h1>Dano Industries</h1> 
    <p>Some info about Dano Industries</p> 
    <p><a href="mike.xml">Next</a></p> 
</html> 

HTML для Mike (mike.htm :)

<html> 
    <h1>Mike and Co.</h1> 
    <p>Some info about Mike and Co.</p> 
    <p><a href="dano.xml">Back</a>&nbsp;|&nbsp;<a href="steve.xml">Next</a></p> 
</html> 

HTML для Стива (steve.htm :)

<html> 
    <h1>Steve Inc.</h1> 
    <p>Some info about Steve Inc.</p> 
    <p><a href="mike.xml">Back</a></p> 
</html> 
+0

DevNull, Похоже, это то, что я ищу, но я получаю эту ошибку, когда пытаюсь ее запустить: Ошибка загрузки таблицы стилей: Неверная функция XSLT/XPath. –

+0

Какой процессор вы используете? Я использую Saxon 9, и все работает нормально. Если вы используете Xalan, попробуйте удалить все функции 'data()'. Пример: 'data (compName)' -> 'compName' (есть 4' data() 'functions total) –

+0

Извините, я не использую XSLT-процессор, такой как Saxon или Xalan. Я даже не знаю, с чего начать с работы с ними. Я просто код и предварительный просмотр в моем браузере –

1

Это преобразование:

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

<xsl:template match="/*"> 
    <html> 
    <table border="1"> 
     <xsl:apply-templates/> 
    </table> 
    </html> 
</xsl:template> 

<xsl:template match="company"> 
    <xsl:variable name="vPrevious" 
    select="preceding-sibling::company[1]/link"/> 

    <xsl:variable name="vNext" 
    select="following-sibling::company[1]/link"/> 
    <tr> 
    <td> 
     <a href="{link}"><xsl:value-of select="name"/></a> 
    </td> 
    <td> 
     &#xA0; 
     <xsl:if test="$vPrevious"> 
     <a href="{$vPrevious}">Back</a> 
     </xsl:if> 
    </td> 
    <td> 
     &#xA0; 
     <xsl:if test="$vNext"> 
     <a href="{$vNext}">Next</a> 
     </xsl:if> 
    </td> 
    </tr> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на поставленном XML документа:

<portfolio> 
    <company> 
     <name>Dano Industries</name> 
     <link>dano.xml</link> 
    </company> 
    <company> 
     <name>Mike and Co.</name> 
     <link>mike.xml</link> 
    </company> 
    <company> 
     <name>Steve Inc.</name> 
     <link>steve.xml</link> 
    </company> 
</portfolio> 

производит нужную таблицу HTML с "Назад" и "Далее" ссылки:

<html> 
    <table border="1"> 
     <tr> 
      <td> 
       <a href="dano.xml">Dano Industries</a> 
      </td> 
      <td>  </td> 
      <td> 
       <a href="mike.xml">Next</a> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <a href="mike.xml">Mike and Co.</a> 
      </td> 
      <td> 
       <a href="dano.xml">Back</a> 
      </td> 
      <td> 
       <a href="steve.xml">Next</a> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <a href="steve.xml">Steve Inc.</a> 
      </td> 
      <td> 
       <a href="mike.xml">Back</a> 
      </td> 
      <td>  </td> 
     </tr> 
    </table> 
</html> 
+0

Спасибо за помощь. Dimitre, ваше решение, безусловно, работает, но то, что я ищу, немного отличается (извините, что трудно быть конкретным, когда я так новичок в этом.) У меня есть эти компании, населяющие список в настоящее время, и каждая компания имеет их собственный XML-файл (mike.xml, dano.xml), содержащий детали. На каждой соответствующей личной странице идет страница и следующая страница, а не страница с основным списком. Как я могу это сделать? Должен ли я разместить главный список в XML-файле каждой компании? или я могу использовать какую-то переменную для ссылки? Заранее спасибо. –

+0

@ Andrew-Parisi: вам нужно решить какую-то определенную схему URL, чтобы можно было составить URL-адрес страницы «Назад» и «Далее» из данных, доступных в элементе 'company'. Эта схема будет использоваться для создания ссылок Back и Next. Если вы определяете эту схему URL в своем вопросе, возможно, будет возможно предоставить решение, которое генерирует именно нужные URL-адреса. –

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