以下是我的XML文件 -
<School>
<Std c="8">
<Name>ABC</Name>
<Age>12</Age>
<Name>EFG</Name>
<Age>11</Age>
<Name>PQR</Name>
<Age>12</Age>
<Name>XYZ</Name>
<Age>11</Age>
</Std>
</School>
我希望HTML输出为 -
Name Age
ABC 12
EFG 11
PQR 12
XYZ 11
答案 0 :(得分:6)
这是一个完全通用的解决方案,适用于任意数量的列:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kColsByName" match="Std/*"
use="name()"/>
<xsl:variable name="vCols" select=
"*/*/*
[generate-id()
=
generate-id(key('kColsByName', name())[1])
]
"/>
<xsl:variable name="vNumCols" select="count($vCols)"/>
<xsl:template match="/*/Std">
<table>
<tr>
<xsl:apply-templates select="$vCols"
mode="head"/>
</tr>
<xsl:apply-templates select=
"*[position() mod $vNumCols = 1]"/>
</table>
</xsl:template>
<xsl:template match="Std/*" mode="head">
<th><xsl:value-of select="name()"/></th>
</xsl:template>
<xsl:template match="Std/*">
<tr>
<xsl:apply-templates mode="inrow" select=
"(. | following-sibling::*)
[not(position() > $vNumCols)]"/>
</tr>
</xsl:template>
<xsl:template match="Std/*" mode="inrow">
<td><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<School>
<Std c="8">
<Name>ABC</Name>
<Age>12</Age>
<Name>EFG</Name>
<Age>11</Age>
<Name>PQR</Name>
<Age>12</Age>
<Name>XYZ</Name>
<Age>11</Age>
</Std>
</School>
产生了想要的正确结果:
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td>ABC</td>
<td>12</td>
</tr>
<tr>
<td>EFG</td>
<td>11</td>
</tr>
<tr>
<td>PQR</td>
<td>12</td>
</tr>
<tr>
<td>XYZ</td>
<td>11</td>
</tr>
</table>
现在,如果我们向原始XML文档添加新列(例如Sex
):
<School>
<Std c="8">
<Name>ABC</Name>
<Age>12</Age>
<Sex>M</Sex>
<Name>EFG</Name>
<Age>11</Age>
<Sex>F</Sex>
<Name>PQR</Name>
<Age>12</Age>
<Sex>F</Sex>
<Name>XYZ</Name>
<Age>11</Age>
<Sex>M</Sex>
</Std>
</School>
我们可以在不做任何修改的情况下应用上面相同的转换,并且它会再次产生正确的结果 - 这表明转换是真正的通用:
<table>
<tr>
<th>Name</th>
<th>Age</th>
<th>Sex</th>
</tr>
<tr>
<td>ABC</td>
<td>12</td>
<td>M</td>
</tr>
<tr>
<td>EFG</td>
<td>11</td>
<td>F</td>
</tr>
<tr>
<td>PQR</td>
<td>12</td>
<td>F</td>
</tr>
<tr>
<td>XYZ</td>
<td>11</td>
<td>M</td>
</tr>
</table>
答案 1 :(得分:2)
<?xml version="1.0" encoding="utf-8"?>
<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:output method="html" indent="yes"/>
<xsl:template match="School">
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<xsl:for-each select="Std/Name">
<tr>
<td>
<xsl:value-of select="."/>
</td>
<td>
<xsl:value-of select="following::Age"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:-1)
http://p2p.wrox.com/xslt/66523-create-generic-xsl-template-create-table.html
这个xslt生成通用表:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/*">
<table border="1" >
<thead >
<tr bgcolor="red">
<xsl:apply-templates select="*[1]/*" mode="th"/>
</tr>
</thead>
<tbody>
<xsl:apply-templates select="*"/>
</tbody>
</table>
</xsl:template>
<xsl:template match="/*/*/*" mode="th">
<th>
<xsl:value-of select="name()"/>
</th>
</xsl:template>
<xsl:template match="/*/*">
<tr>
<xsl:apply-templates select="*"/>
</tr>
</xsl:template>
<xsl:template match="/*/*/*">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>