如果下一个元素的类是'xxx',我想在 xhtml 文件中将特定的 td 更改为 th 然后删除这些元素(使用类'xxx'),但前兄弟在模板中是错误的,所以我必须错过一些东西:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="http://www.w3.org/1999/xhtml">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//x:tr[@class='xxx']/preceding-sibling::x:tr/td">
<th>
<xsl:apply-templates select="@* | node()"/>
</th>
</xsl:template>
<xsl:template match="//x:tr[@class='xxx']"/>
</xsl:stylesheet>
修改 样本文件:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="cs-CZ" xml:lang="cs-CZ">
<head>
<title>test</title>
<meta charset="UTF-8"/>
<link rel="stylesheet" type="text/css" href="xxx.css"/>
</head>
<body>
<table>
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr class="xxx">
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>error row to remove if present</td>
</tr>
</table>
</body>
</html>
我想要的是第一行表格 th 并删除最后一个错误行(如果存在)并保留HTML5 doctype:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="cs-CZ" xml:lang="cs-CZ">
<head>
<title>test</title>
<meta charset="UTF-8"/>
<link rel="stylesheet" type="text/css" href="xxx.css"/>
</head>
<body>
<table>
<tr>
<th>1</th>
<th>2</th>
<th>3</th>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
</table>
</body>
</html>
我得到(<xsl:template match="//x:tr[following-sibling::x:tr[1]/@class='xxx']/x:td">
现在在XSLT文档中有效):
<?xml version='1.0' encoding='UTF-8'?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="cs-CZ" xml:lang="cs-CZ">
<head>
<title>test</title>
<meta charset="UTF-8"/>
<link rel="stylesheet" type="text/css" href="xxx.css"/>
</head>
<body>
<table>
<tr>
<th xmlns="" xmlns:x="http://www.w3.org/1999/xhtml">1</th>
<th xmlns="" xmlns:x="http://www.w3.org/1999/xhtml">2</th>
<th xmlns="" xmlns:x="http://www.w3.org/1999/xhtml">3</th>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>error row to remove if present</td>
</tr>
</table>
</body>
因此没有doctype,并且在这些单元格中不存在名称空间。我不知道如何删除错误的行(它应该总是最后一行)。
答案 0 :(得分:1)
有了一些好处,我认为这样的事情可能会这样:
<xsl:template match="//x:tr[following-sibling::x:tr[1]/@class='xxx']/x:td">
(未经测试!)
答案 1 :(得分:0)
如果要在XHTML命名空间中创建新的th
元素,则需要将其添加到样式表中:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="x">
<xsl:output method="xml" doctype-system="about:legacy-compat"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="x:tr[following-sibling::x:tr[1][@class = 'xxx']]/x:td">
<th>
<xsl:apply-templates select="@* | node()"/>
</th>
</xsl:template>
<xsl:template match="x:tr[@class = 'xxx'] | x:tr[last()]"/>
</xsl:stylesheet>
至于保留DOCTYPE,您需要创建一个新的,至少在XSLT 1.0中(在HTML5之前的大约15年内于1999年完成)您所能做的就是使用<xsl:output method="xml" doctype-system="about:legacy-compat"/>
来输出
<!DOCTYPE html
SYSTEM "about:legacy-compat">