我有一个测试html表:
<table>
<tr>
<th style="width:10px;" />
<th style="width:80px;">Name</th>
<th style="width:350px;">Number</th>
<th style="width:80px;">Date<br />2014-12-31</th>
</tr>
<tr class="parent" data-level="0">
<td />
<td class="Center">123-12345</td>
<td> Range</td>
<td class="Number">
<br />
</td>
</tr>
<tr class="child" >
<td>
<div class="childNo" />
</td>
<td class="Center">D</td>
<td> Test Description</td>
<td class="Number">123456<br /></td>
</tr>
</table>
我想要做的就是检查<TR>
类是否是&#34; parent&#34;,如果是,则连接&#34; expando&#34;上课。所以它看起来像这样:
<table>
<tr>
<th style="width:10px;" />
<th style="width:80px;">Name</th>
<th style="width:350px;">Number</th>
<th style="width:80px;">Date<br />2014-12-31</th>
</tr>
<tr class="parent expando" data-level="0">
....
我似乎无法使用xsl执行此操作。我不确定是否需要使用模板匹配。
任何帮助都将不胜感激。
提前致谢。
答案 0 :(得分:1)
您可以复制整个表格,只将类添加到tr
class="parent"
这样的所有<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat"
omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tr[@class='parent']">
<xsl:copy>
<xsl:attribute name="class" select="'parent expando'"/>
<xsl:attribute name="data-level" select="@data-level"/>
<xsl:apply-templates select="td"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
:
<table>
<tr>
<th style="width:10px;"></th>
<th style="width:80px;">Name</th>
<th style="width:350px;">Number</th>
<th style="width:80px;">Date<br>2014-12-31
</th>
</tr>
<tr class="parent expando" data-level="0">
<td></td>
<td class="Center">123-12345</td>
<td> Range</td>
<td class="Number"><br></td>
</tr>
<tr class="child">
<td>
<div class="childNo"></div>
</td>
<td class="Center">D</td>
<td> Test Description</td>
<td class="Number">123456<br></td>
</tr>
</table>
输出:
<xsl:template match="tr[@class='parent']">
匹配模式tr
的模板
使用
parent
的所有<xsl:copy>
<xsl:attribute name="class" select="'parent expando'"/>
<xsl:attribute name="data-level" select="@data-level"/>
<xsl:apply-templates select="td"/>
</xsl:copy>
tr
复制整个class
并将属性tr
的值更改为两个类。
更新:作为附加要求,这也适用于parent
,可以在课程<xsl:template match="tr[contains(@class,'parent')]">
<xsl:copy>
<xsl:attribute name="class" select="concat(@class, ' expando')"/>
<xsl:attribute name="data-level" select="@data-level"/>
<xsl:apply-templates select="td"/>
</xsl:copy>
</xsl:template>
中添加其他课程。
以下调整处理:
tr
现在所有parent
将匹配包含类expando
的内容,并且作为class属性的新值,类<xsl:attribute name="class" select="concat(@class, ' expando')"/>
将添加到当前类值:
<xsl:attribute>
更新:注意到注释,这不是<xsl:attribute name="class">
<xsl:value-of select="concat(@class, ' expando')"/>
</xsl:attribute>
<xsl:attribute name="data-level">
<xsl:value-of select="@data-level"/>
</xsl:attribute>
的有效XSLT 1.0语法 - 它应该是
Attribute select is not allowed on this element
这是使用在线XSLT处理器测试的,虽然XSLT之前已声明为1.0,但它并未抛出任何错误。正如评论中所提到的,使用XSLT 2.0处理器(Saxon 9.5.1.6)是错误的,在线版本中,它不会将所有错误和警告传递给用户。切换到XSLT 1.0处理器(Saxon 6.5)导致正确的错误class
。
虽然这是公认的答案,但在我看来,Lingamurthy CS给出的答案是更好/更清洁的方法,因为它只会改变必要的xsl:copy
属性。我应该知道更好地保存一些不必要的{{1}}。
答案 1 :(得分:1)
您可以使用以下样式表,其中包含两个模板。首先,使用标识模板复制源文档中的所有节点。其次,仅更新其父级为@class
的{{1}},并且如果&#34; parent&#34;则更新值,因此,无需担心tr
元素或其他属性:< / p>
tr