2014-02-16 2 views
1

Играя с xml и xslt и пытаясь завладеть им.Преобразование XML в XSLT - первый раз

Мой XML-код выглядит следующим образом:

<hello-world> 
    <header eng="Welcome!" dk="Velkommen"></header> 
    <greeting> 
     <eng>Hello, World!</eng> 
     <dk>Hej verden</dk> 
    </greeting> 
    <greeting> 
     <eng>Hello space</eng> 
     <dk>Hej Rummet!</dk> 
    </greeting> 
    <greeting> 
     <eng>Hey Mom! Im coding XSLT</eng> 
     <dk>Hej Mor! Jeg koder XSLT</dk> 
    </greeting> 
</hello-world> 

До сих пор я переведенный мой XML в этот HTML:

<html> 
    <body> 
     <div> 
     <ul> 
      <li>Hello, World!</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hello space</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hey Mom! Im coding XSLT</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej verden</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej Rummet!</li> 
     </ul> 
     </div> 
     <div> 
     <ul> 
      <li>Hej Mor! Jeg koder XSLT</li> 
     </ul> 
     </div> 
    </body> 
</html> 

С помощью этого XSLT:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:for-each select="/hello-world/greeting"> 
<div> 
     <ul> 
     <li><xsl:value-of select="eng" /></li> 
     </ul> 
    </div> 
     </xsl:for-each> 
<xsl:for-each select="/hello-world/greeting"> 
<div> 
     <ul> 
     <li><xsl:value-of select="dk" /></li> 
     </ul> 
    </div> 
     </xsl:for-each> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Что я хотел бы знать, если есть лучший способ сделать это, и как я мог бы реализовать и выбрать правильный атрибут на th e и применять в foreach.

Спасибо!

+0

В XSLT вы можете определить свои собственные шаблоны * * с помощью [применить-шаблон функции] (http://msdn.microsoft.com/en-us/library/ms256045% 28v = vs.110% 29.aspx), что несколько эквивалентно функции на языке процедурного программирования. – pasty

+0

Не могли бы вы переделать свой вопрос, чтобы вопрос по-прежнему был найден Google? В настоящий момент вопрос абсолютно бесполезен. –

ответ

-1

В XSLT можно определить собственные шаблоны с использованием apply-template function, что несколько эквивалентно функции на языке процедурного программирования. Шаблон применяется к значению выбора. Шаблоны - мощная концепция. Они также могут принимать параметры, чтобы вы могли передавать более одного значения в шаблон и управлять потоком.

Вы должны определить шаблоны для двух языков (после основного шаблона):

<xsl:template match="dk"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

    <xsl:template match="eng"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

, а затем называют их в основном шаблоне для полезного значения:

<xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="eng"></xsl:apply-templates> 
     </xsl:for-each> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="dk"></xsl:apply-templates> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

Выход будет таким же, как ваш оригинал. Вы в основном говорите что-то вроде formatOutputFor(currentStringValue). Полная трансформация выглядит следующим образом:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="eng"></xsl:apply-templates> 
     </xsl:for-each> 
     <xsl:for-each select="/hello-world/greeting"> 
      <xsl:apply-templates select="dk"></xsl:apply-templates> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="dk"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

    <xsl:template match="eng"> 
    <div> 
     <ul> 
     <li> 
      <xsl:value-of select="." /> 
     </li> 
     </ul> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Поскольку оба шаблона выполняют ту же работу, я думаю, что этот код немного громоздкий и избыточный. –

+0

Это всего лишь вариация вашего решения. Да, он содержит избыточный код, но я думаю, что его легче понять для человека, который менее опытен и знаком с концепцией XSLT. – pasty

+0

Помогло ли downvoter объяснить, что не так с ответом? – pasty

2

Вы можете использовать шаблон, который делает что-то для обоих и элементов «ДК», «ENG», и применять его в последовательности для «рус» и «дк»:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
     <body> 
      <xsl:apply-templates select="hello-world/greeting/eng"/> 
      <xsl:apply-templates select="hello-world/greeting/dk"/> 
     </body> 
    </html> 
</xsl:template> 

<xsl:template match="dk | eng"> 
    <div> 
    <ul> 
     <li><xsl:value-of select="."/></li> 
    </ul> 
    </div> 
</xsl:template> 
</xsl:stylesheet> 
+0

Удивительный, это отличный способ! Но все еще имея вызов, применяя

в последовательности? – user3315960

+0

Извините, но не понял проблемы. Не могли бы вы объяснить? –

+0

Nevermind, я нашел решение :) Спасибо за помощь! – user3315960

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