尝试搜索论坛但没找到我需要的东西所以我想我会问。我是XSL的新手,所以我几乎不知道如何解析它,但是可以理解写的是什么,所以这个问题我认为相当容易,我只是没有线索因为我从未使用过XSL之前。如果我使用奇怪/错误的术语,请原谅我。
背景,我从数据库中获取的XML非常简单,只使用一个简单的copy-of语句来复制节点,因为大多数只是直接的html。这是返回给我的代码的示例部分,如下所示:
<tbody>
<tr>
<td class="Bold Label Center">1</td>
<td class="Bold Label Stub Left">Area</td>
<td class="Bold Right">3.68</td>
</tr>
<tr>
<td class="Bold Label Center">2</td>
<td Indentation="2" class="Bold Label Stub Left">United States</td>
<td class="Bold Right">7.68</td>
</tr>
<tr>
<td class="Bold Label Center">3</td>
<td Indentation="6" class="Label Stub Left">Oregon</td>
<td class="Right">2.7</td>
</tr>
etc....
<tr>
<td class="Label Center">23</td>
<td Indentation="6" class="Label Stub Left">Portland<sup>1</sup></td>
<td class="Right">12.345</td>
</tr>
</tbody>
XSL
<xsl:for-each select="div[@class='HtmlTable']/table">
<table cellpadding="0" cellspacing="0">
<xsl:copy-of select="tbody"/>
</table>
</xsl:for-each>
这当然很好,我已经拿出一些其他代码只是为了保持简单。但我不知道该怎么做,是让TD类属性成为TD标签的一部分。所以我希望输出理想地在例如第一行输出中为:
<TR><TD align=center><B>1</B></TD><TD align=left><B>Area</B></TD>
<TD align=right>3.68</TD></TR>
现在只是副本的输出当然不会转移那些我不知道该怎么做的属性。
我当然也希望缩进一些项目(也许是样式像素),并使上标标签起作用。
我确信这很简单,但这对我来说是全新的,我只是在旋转我的车轮而无处可去。任何帮助都会受到赞赏,我的直觉是这很简单。
答案 0 :(得分:0)
您可以创建一个模板,用于选择<td>
个节点,并检查class
属性是否包含Center
,Left
或Right
。然后,您使用适当的td
属性生成align
。
根据您的示例,这是一种简单的方法。
将copy-of
替换为apply-templates
:
<xsl:template match="/">
<xsl:for-each select="div[@class='HtmlTable']/table">
<table cellpadding="0" cellspacing="0">
<xsl:apply-templates select="tbody"/>
</table>
</xsl:for-each>
</xsl:template>
为tbody
和tr
添加模板(如果您有许多这样的简单副本,身份转换可以处理所有这些模板):
<xsl:template match="tbody">
<xsl:copy>
<xsl:apply-templates select="tr"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tr">
<xsl:copy>
<xsl:apply-templates select="td"/>
</xsl:copy>
</xsl:template>
为每个td
对齐案例添加模板:
<xsl:template match="td[contains(@class, 'Center')]">
<td align="center">
<xsl:copy-of select="node()"/>
</td>
</xsl:template>
<xsl:template match="td[contains(@class, 'Left')]">
<td align="left">
<xsl:copy-of select="node()"/>
</td>
</xsl:template>
<xsl:template match="td[contains(@class, 'Right')]">
<td align="right">
<xsl:copy-of select="node()"/>
</td>
</xsl:template>
这将生成一个包含td
个元素的表,其中包含align
个属性,而不是类选择器。
请在此处查看工作示例: XSLT Fiddle