我试图使用XSLT样式表来转换XHTML,但我甚至无法获得基本样式表来匹配任何内容.我确定我错过了一些简单的事情.
这是我的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>
Run Code Online (Sandbox Code Playgroud)
实际内容并不重要,我将在下面演示.顺便说一句,我很确定该文档是通过创建文档而形成的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>
Run Code Online (Sandbox Code Playgroud)
转换是通过完成的xsltproc --nonet stylesheet.xsl input.html,输出是:"--- [] ---"(即,它没有找到子元素html).但是,如果我将该for-each部分更改为:
<xsl:for-each select="*">
<xsl:value-of select="name()"/>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
然后我得到"--- [html] ---".同样,如果我使用for-each select="*/*",我会像我期望的那样得到"--- [headbody] ---".
为什么它可以通过*(name()给出正确的名称)找到子元素但是它不会直接使用元素名称找到它?
html源XML中的元素定义了命名空间.您必须将其包含在匹配表达式中并在xsl:stylesheet元素中引用它:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:text>---[</xsl:text>
<xsl:for-each select="html:html">
<xsl:text>Found HTML element.</xsl:text>
</xsl:for-each>
<xsl:text>]---</xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)