我有一个xml结果集,必须使用XSL进行转换才能显示到vb.net应用程序中的excel电子表格中。 xml结果集有15列(客户端的15个属性,如firstname,lastname,address等),我不想使用property或xml元素名称对xsl / xpath的select属性进行硬编码。我需要一个可以将xsl转换为行和列的XSL,而不需要知道列名或任何硬编码。使标题加粗是首选 我尝试过这样做,并达到某一点但远离最终结果。请帮助完成这个
这是输入XML
<?xml version="1.0" encoding="utf-8"?>
<ClientArray>
<Client>
<LastName>Bill</LastName>
<FirstName>Gates</FirstName>
<MiddleName/>
<Suffix/>
<DateOfBirth>30-May-1968</DateOfBirth>
<PlaceOfBirth/>
<SSN>n/a</SSN>
<Gender>Male</Gender>
<City>SHELTON</City>
<State>WA</State>
<Zip>96484</Zip>
</Client>
<Client>
<LastName>Warron</LastName>
<FirstName>Buffet</FirstName>
<MiddleName>P</MiddleName>
<Suffix/>
<DateOfBirth>12-Aug-1957</DateOfBirth>
<PlaceOfBirth>Mississippi</PlaceOfBirth>
<SSN>n/a</SSN>
<Gender>Male</Gender>
<City>Missi</City>
<State>KS</State>
<Zip>66096</Zip>
</Client>
<Client>
<LastName>Steev</LastName>
<FirstName>Jobbs</FirstName>
<MiddleName/>
<Suffix/>
<DateOfBirth>19-Apr-1959</DateOfBirth>
<PlaceOfBirth>Cupertino</PlaceOfBirth>
<SSN>n/a</SSN>
<Gender>Male</Gender>
<City>Cupertino</City>
<State>CA</State>
<Zip>96066</Zip>
</Client>
</ClientArray>
这是我的代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<HEAD>
<STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE>
</HEAD>
<BODY>
<TABLE border="1">
<!-- Global variable to get column count -->
<xsl:variable name="columns" select="number(/list/@columns)"/>
<THEAD>
<TR class="tblHeader">
<xsl:for-each select="ClientArray/Client">
<TD>name()</TD> <!-- {Getting the xml column header here} -->
</xsl:for-each>
</TR>
</THEAD>
<TBODY>
<xsl:for-each select="ClientArray/Client">
<TR>
<xsl:choose>
<xsl:when test="position() mod 2 = 1">
<xsl:attribute name="class">row1</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class">row2</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:for-each select=".">
<TD>
<xsl:value-of select="./*[count(child::*) = 0]"/>
</TD>
</xsl:for-each>
</TBODY>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
我想要的输出是
LastName FirstName MiddleName后缀等..... 比尔盖茨 自助沃伦 等等
基本上,XML必须转换为可以导出到EXCEL的普通表。他们的关键是我不想在“选择”xpath属性上进行任何硬编码,这样如果我添加更多输入字段,XSL的工作没有问题。 xsl应在不知道列名的情况下循环所有列
答案 0 :(得分:1)
保留for-each
驱动程序:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<HEAD>
<STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE>
</HEAD>
<BODY>
<TABLE border="1">
<THEAD>
<TR class="tblHeader">
<xsl:for-each select="*/*[1]/*">
<TH>
<xsl:value-of select="name()"/>
</TH>
<!-- {Getting the xml column header here} -->
</xsl:for-each>
</TR>
</THEAD>
<TBODY>
<xsl:for-each select="ClientArray/Client">
<TR>
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="position() mod 2 = 1">row1</xsl:when>
<xsl:otherwise>row2</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:for-each select="*">
<TD>
<xsl:value-of select="."/>
</TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</TBODY>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
注意:我稍后会使用“XSLT样式”样式表回来。
编辑:我很匆忙。关键是我的回答。遗憾。
编辑2 :在“XSLT样式”中添加了样式表。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/ClientArray">
<HTML>
<HEAD>
<STYLE type="text/css"> TABLE{table-layout: automatic; width:100%} .tblHeader{background-color:RGB(192,192,192);font-weight:bold} .row1{background-color:RGB(204,204,255)} .row2{background-color:RGB(153,204,255)} </STYLE>
</HEAD>
<BODY>
<TABLE border="1">
<THEAD>
<TR class="tblHeader">
<xsl:apply-templates select="Client[1]/*" mode="headers"/>
</TR>
</THEAD>
<TBODY>
<xsl:apply-templates/>
</TBODY>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="Client">
<TR class="row{2 - position() mod 2}">
<xsl:apply-templates/>
</TR>
</xsl:template>
<xsl:template match="Client/*" mode="headers">
<TH>
<xsl:value-of select="name()"/>
</TH>
</xsl:template>
<xsl:template match="Client/*">
<TD>
<xsl:value-of select="."/>
</TD>
</xsl:template>
</xsl:stylesheet>
注意:这些样式表假设Client
元素的所有子元素都相同且顺序相同。如果你愿意,我会回来找一个更通用的解决方案。
答案 1 :(得分:0)
您目前拥有(尝试过)的代码是什么? 输入代码是什么样的? ouput 代码应该是什么样的?
如果你不提供一些细节,那将很难回答。 ;)