我是XSLT初学者,我的要求是以表格格式获取元素及其各自的值,我尝试了但是我没有得到期望,请为我的要求提出解决方案。
我的输入XML是
<group>
<elementgroup1>
<element1>value1</element1>
<element2/>
<element3>value3</element3>
</elementgroup1>
<elementgroup2>
<elementsubgroup2>
<element4>value4</element4>
<element5>value5</element5>
</elementsubgroup2>
</elementgroup2>
</group>
我的xslt是
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="/">
<xsl:element name="table">
<xsl:attribute name="border" select="'1'"/>
<xsl:element name="tr">
<xsl:element name="th">XML Viewer</xsl:element>
</xsl:element>
<xsl:for-each select="/group//*">
<xsl:call-template name="mytemplate"/>
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:template name="mytemplate">
<xsl:element name="tr">
<xsl:element name="td">
<xsl:value-of select="name()"></xsl:value-of>
</xsl:element>
<xsl:for-each select="child::*">
<xsl:element name="td">
<xsl:value-of select="."></xsl:value-of>
</xsl:element>
</xsl:for-each>
</xsl:element>
/xsl:template>
</xsl:stylesheet>
我需要的输出
<table border="1">
<tr>
<th>
Output
</th>
</tr>
<tr>
<td>
group
</td>
<td/>
</tr>
<tr>
<td>
elementgroup1
</td>
<td/>
</tr>
<tr>
<td>
element1
</td>
<td>
value1
</td>
</tr>
<tr>
<td>
element2
</td>
<td/>
</tr>
<td>
element3
</td>
<td>
value3
</td>
</tr>
</table>
显示输出 输出应采用表格格式,请参见下文
Output
group
elementgroup1
element1 value1
element2
element3 value3
.
.
.
go on till end
答案 0 :(得分:1)
当我理解正确时,你需要像这样的转换
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="*"/>
</table>
</xsl:template>
<xsl:template match="*">
<tr>
<td><xsl:value-of select="name()"/></td>
<td><xsl:value-of select="normalize-space(text())"/></td>
</tr>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
生成示例XML的以下输出
<table>
<tr>
<td>group</td>
<td></td>
</tr>
<tr>
<td>elementgroup1</td>
<td></td>
</tr>
<tr>
<td>element1</td>
<td>value1</td>
</tr>
<tr>
<td>element2</td>
<td></td>
</tr>
<tr>
<td>element3</td>
<td>value3</td>
</tr>
<tr>
<td>elementgroup2</td>
<td></td>
</tr>
<tr>
<td>elementsubgroup2</td>
<td></td>
</tr>
<tr>
<td>element4</td>
<td>value4</td>
</tr>
<tr>
<td>element5</td>
<td>value5</td>
</tr>
</table>
= edit =
使元素变粗,不包含文本(需要CSS span-class font-bold
):
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
<xsl:template match="/">
<table>
<xsl:apply-templates select="*"/>
</table>
</xsl:template>
<xsl:template match="*">
<xsl:variable name="bold">
<xsl:value-of select="'font'"/>
<xsl:if test="not(string-length(normalize-space(text())))">
<xsl:value-of select="'-bold'"/>
</xsl:if>
</xsl:variable>
<tr>
<td><span class="{$bold}"><xsl:value-of select="name()"/></span></td>
<td><xsl:value-of select="normalize-space(text())"/></td>
</tr>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
试试这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:template match="*">
<table>
<xsl:for-each select="*">
<tr>
<td>
<xsl:value-of select="name()"/>
</td>
<td>
<xsl:value-of select="text()"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>