Как преобразовать XML в HTML с помощью XSL?

#html #xml #xslt

#HTML #xml #xslt

Вопрос:

Мне нужно преобразовать XML-документ в html с помощью XSLTProcessor.

Мой XML-документ:

 <?xml version="1.0" encoding="utf-8"?>
<items>
    <item>
        <property title="title1"><![CDATA[data1]]></property>
        <property title="title2"><![CDATA[data3]]></property>
        <property title="title3"><![CDATA[data3]]></property>
        </item>
        <item>
        <property title="title4"><![CDATA[data4]]></property>
        <property title="title5"><![CDATA[data5]]></property>
        <property title="title6"><![CDATA[data6]]></property>
        </item>
</items>
  

Что я должен получить, так это:

 <html>
    <table border="1">
        <tr bgcolor="#eee"><td colspan="2">title1: data1</td></tr>
                <tr><td> title2</td> <td>data2</td></tr>
        <tr><td> title3</td> <td>data3</td></tr> 

        <tr bgcolor="#eee"><td colspan="2">title4: data4</td></tr>
                <tr><td> title5</td> <td>data5</td></tr>
        <tr><td> title6</td> <td>data6</td></tr>


    </table>
</html>
  

Мой файл xsl теперь:

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:php="http://php.net/xsl"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
    <html>
        <xsl:apply-templates select="items"/>
    </html>
    </xsl:template>

    <xsl:template match="items">
    <table border="1">
        <xsl:apply-templates select="item"/>
        </table>
    </xsl:template>

    <xsl:template match="item">

    <tr bgcolor="#eee"> <td colspan="2">
        <xsl:value-of select="/descendant::*/@*"/>:
        <xsl:value-of select="property"/>
        </td> </tr>

    </xsl:template>
</xsl:stylesheet>
  

Но он возвращает только первый тег «свойство». Я новичок в xslt, что мне нужно сделать, чтобы получить список тегов «property»?

Ответ №1:

Вначале вы нормально использовали шаблоны, просто продолжайте это делать, создавая шаблоны и применяя их:

 <xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
    <html>
        <xsl:apply-templates select="items"/>
    </html>
    </xsl:template>

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

    <xsl:template match="item/property[1]">

    <tr bgcolor="#eee"> <td colspan="2">
        <xsl:value-of select="@title"/>:
        <xsl:value-of select="."/>
        </td> </tr>

    </xsl:template>

    <xsl:template match="item/property[not(position() = 1)]">
      <tr>
        <td><xsl:value-of select="@title"/></td>
        <td><xsl:value-of select="."/></td>
      </tr>
    </xsl:template>
</xsl:stylesheet>
  

Ответ №2:

Вам нужно использовать for-each инструкцию

 <xsl:template match="item">
  <xsl:for-each select = "property">
    <tr bgcolor="#eee"> 
      <td colspan="2">
        <xsl:value-of select="/descendant-or-self::*/@*"/>:
        <xsl:value-of select="."/>
      </td> 
    </tr>
  </xsl:for-each>
</xsl:template>
  

Я также изменил ваш descendant descendant-or-self , чтобы он был точно эквивалентен тому, что у вас было раньше.

Комментарии:

1. Спасибо, это тоже работает, но используйте »