2016-04-20 2 views
0

Я хочу изменить конкретными тд к ю в XHTML файла, если класса следующего элемента является «ххм», а затем удалить эти элементы (с классом «ххх») , но предшествующее-родственный неправильно в шаблоне, так что я должен пропустить что-то:XSLT изменение названия элемент - предшествующий-родственный неправильно

<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> 

EDIT: образец документа:

<?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> 

То, что я хочу, это первый ряд таблицы в й и удалить последнюю строку ошибки, если присутствует и сохранить 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> 

Так нет доктайп и в th ячейках есть пространства имен, которых там не было бы. Я не знаю, как удалить неправильную строку (она всегда должна быть последней строкой).

+2

Как о проводке образца ввода и результат вы хотите, вместе с результатом вы получаете? –

ответ

0

Если вы хотите создать новые th элементы в пространстве имен XHTML, то вам нужно добавить его в таблице стилей:

<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 (которая была завершена в 1999 году около 15 лет будет передний HTML5) все, что вы можете сделать, это использовать <xsl:output method="xml" doctype-system="about:legacy-compat"/> для вывода

<!DOCTYPE html 
    SYSTEM "about:legacy-compat"> 
1

С некоторыми Гест, я полагаю, что-то подобное может сделать:

<xsl:template match="//x:tr[following-sibling::x:tr[1]/@class='xxx']/x:td"> 

(не тестировался!)

+0

Спасибо @ hr_117 с этой модификацией. Документ XSLT действителен. Я редактировал сообщение с образцами. – d3im

Смежные вопросы