Я пытаюсь преобразовать XHTML с помощью таблицы стилей XSLT, но я даже не могу получить базовую таблицу стилей, которая бы соответствовала чему-либо. Я уверен, что упускаю что-то простое.
Вот мой исходный документ XHTML (никаких больших сюрпризов):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 25 March 2009), see www.w3.org" />
...
</body>
</html>
Фактическое содержание не имеет большого значения, как я продемонстрирую ниже. Кстати, я уверен, что документ правильно сформирован, так как он был создан с помощью tidy -asxml
.
Мои более сложные выражения XPath не возвращали никаких результатов, поэтому в качестве теста здравомыслия я пытаюсь преобразовать его очень просто, используя следующую таблицу стилей:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:text>---[</xsl:text>
<xsl:for-each select="html">
<xsl:text>Found HTML element.</xsl:text>
</xsl:for-each>
<xsl:text>]---</xsl:text>
</xsl:template>
</xsl:stylesheet>
Преобразование выполняется через xsltproc --nonet stylesheet.xsl input.html
, и вывод: "--- [] ---" (то есть, он не нашел дочерний элемент html
). Однако, если я изменю раздел for-each
на:
<xsl:for-each select="*">
<xsl:value-of select="name()"/>
</xsl:for-each>
Тогда я получаю "--- [html] ---". И точно так же, если я использую for-each select="*/*"
, я получаю «--- [headbody] ---», как я и ожидал.
Почему он может найти дочерний элемент через *
(с name()
, дающим правильное имя), но не может найти его, используя имя элемента напрямую?