#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. Спасибо, это тоже работает, но используйте »