2017-02-12 6 views
0

Мне нужна помощь. Я борьба с XSLT: У меня есть, например, файл XML так:Включите XML с XSLT в таблицу aHTML. Таблица

<Adresses> 
<Person id="1"> 
    <Name>Bott</Name> 
    <Vorname>Nils</Vorname> 
</Person> 

<Person id="2"> 
    <Name>Hubert</Name> 
    <Vorname>Hubertus</Vorname> 
</Person> 

<Person id="3"> 
    <Name>Large</Name> 
    <Vorname>Lars</Vorname> 
</Person> 

<Numbers> 
    <number> 
    <id>1</id> 
    <tel>12354</tel> 
    </number> 
    <number> 
    <id>3</id> 
    <tel>32354</tel> 
    </number> 
    <number> 
    <id>2</id> 
    <tel>22354</tel> 
    </number> 
</Numbers> 

</Adresses> 

И я должен преобразовать в порядок HTML таблицы. HTML-таблица должна выглядеть folowwing (Заказ после ID):

<table> 
 
    <tr> 
 
    <th>Name</th> 
 
    <th>Vorname</th> 
 
    <th>Tel</th> 
 
    </tr> 
 
    <tr> 
 
    <th>Bott</th> 
 
    <th>Nils</th> 
 
    <th>12354</th> 
 
    </tr> 
 
</table>

Моя проблема я не знаю, как ckeck: Выберите номер, где Peron.id = number.id .... Было бы здорово, если бы кто-нибудь мог дать мне полный пример этой проблемы. В веб-поиске это всегда не так сложно в учебниках ;-(.... Я изучаю XSLT и просто знаю некоторые правила, такие как apply-templates match = «Person» .... но как это возможно в таких заявление назвать другой шаблон которым выберите coorect номер

Я пытаюсь начать с этого:

<xsl:template match="/"> 
<html> 
<body> 
<xsl:for-each select="Adresses/Person"> 
    <xsl:call-template name="curPos"> 
    </xsl:call-template> 
    <xsl:value-of select="Name"/> 
    <xsl:value-of select="Vorname"/> 
    </xsl:for-each> 
</body> 
</html> 
</xsl:template> 


<xsl:template name="curPos" match="Person"> 
<xsl:value-of select="position()"/><br> </br> 
</xsl:template> 

ответ

1

я получил следующее решение XSLT 2.0 для вас:

<xsl:template name="makeTable"> 
    <table> 
    <tr> 
     <th>Name</th> 
     <th>Vorname</th> 
     <th>Tel</th> 
    </tr>   
    <xsl:for-each select="/Adresses/Person"> 
     <tr> 
      <td><xsl:value-of select="Name"/></td> 
      <td><xsl:value-of select="Vorname"/></td> 
      <td><xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/></td> 
     </tr> 
    </xsl:for-each>  
    </table> 
</xsl:template> 

Теперь, для объяснения, насколько я понимаю, проблема у вас есть найти правильное выражение XPath для выбора с правильным номером телефона. Самый важный код пропущен в данном случае эта строка:

<td> 
    <xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/> 
</td> 

В XSLT 2.0 - я не уверен, что XSLT 1.0 - вы можете обратиться к текущему элементу контура с функцией current() в XPath.
Чтобы выбрать номер телефона, я фильтрую для номера на условии его id, равный атрибуту текущего элемента цикла id, а затем получая это дочернее устройство этого узла tel, чтобы получить фактическое число.

+0

Если есть проблема с током(), вы можете установить значение в переменной с помощью , а затем выбрать «../Numbers/number[id=$current_id]/tel». – Mike

+1

Нет проблем с 'current()'. ** ** проблема с названным шаблоном, который не вызывается. –

+0

@ michael.hor257k Я не вижу смысла публиковать мой полный исходный код, когда эта часть отвечает на вопрос довольно хорошо. Вы можете заметить, что тело html также отсутствует. – user1997675

2

Моя проблема я не знаю, как ckeck: Выберите номер, где Peron.id = number.id ....

Это именно то, что keys предназначены для:

XSLT-1,0

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

<xsl:key name="num" match="number" use="id" /> 

<xsl:template match="/Adresses"> 
    <html> 
     <body> 
      <table> 
       <tr> 
        <th>Name</th> 
        <th>Vorname</th> 
        <th>Tel</th> 
       </tr> 
       <xsl:for-each select="Person"> 
        <tr> 
         <td> 
          <xsl:value-of select="Name"/> 
         </td> 
         <td> 
          <xsl:value-of select="Vorname"/> 
         </td> 
         <td> 
          <xsl:value-of select="key('num', @id)/tel"/> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

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

<td> 
    <xsl:value-of select="key('num', @id)/tel"/> 
</td> 

к:

<td> 
    <xsl:for-each select="key('num', @id)"> 
     <xsl:value-of select="tel"/> 
     <br/> 
    </xsl:for-each> 
</td> 
Смежные вопросы