XSLT更改元素名称 - previous-sibling被误解

时间:2016-04-20 17:42:54

标签: xml html5 xslt xhtml

如果下一个元素的类是'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,并且在这些单元格中不存在名称空间。我不知道如何删除错误的行(它应该总是最后一行)。

2 个答案:

答案 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">