在xsl标记中使用class属性

时间:2014-06-10 17:20:48

标签: html xml xslt

尝试搜索论坛但没找到我需要的东西所以我想我会问。我是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&lt;sup&gt;1&lt;/sup&gt;</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>

现在只是副本的输出当然不会转移那些我不知道该怎么做的属性。

我当然也希望缩进一些项目(也许是样式像素),并使上标标签起作用。

我确信这很简单,但这对我来说是全新的,我只是在旋转我的车轮而无处可去。任何帮助都会受到赞赏,我的直觉是这很简单。

1 个答案:

答案 0 :(得分:0)

您可以创建一个模板,用于选择<td>个节点,并检查class属性是否包含CenterLeftRight。然后,您使用适当的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>

tbodytr添加模板(如果您有许多这样的简单副本,身份转换可以处理所有这些模板):

<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