使用xslt获取html文档的标题

时间:2014-12-12 12:10:07

标签: xslt saxon

我无法获得head / title元素的值,如下所示。

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:h="http://www.w3.org/1999/xhtml" 
    version="2.0" >

 <xsl:output method="text" indent="yes"/>

 <xsl:template match="h:title">
    <xsl:value-of select="."/>  
 </xsl:template>

</xsl:stylesheet>

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
.AlignLeft { text-align: left; }
.AlignCenter { text-align: center; }
.AlignRight { text-align: right; }
</style>
<title>Doc title</title>
</head>
<body>
    body
</body>
</html> 


java -jar saxon9he.jar -xsl:style.xsl -s:test.html 

输出:

.AlignLeft { text-align: left; }
.AlignCenter { text-align: center; }
.AlignRight { text-align: right; }
Doc title
    body

预期产出:

 Doc title

1 个答案:

答案 0 :(得分:0)

您遇到的行为是因为XSLT built-in template rules。这些适用于XSLT正在寻找与节点匹配的模板,但不会出现在XSLT中。

目前,XSLT将查找与stylebody匹配的模板,但找不到,因此内置模板将应用并最终输出文本。

您可以做的是明确告诉XSLT只选择title,如下所示:

<xsl:template match="/">
   <xsl:apply-templates select="/h:html/h:head/h:title"/>  
</xsl:template>

或者,添加一个模板,该模板会覆盖停止输出任何文本的内置模板:

 <xsl:template match="text()" />

将这些模板中的任何一个添加到现有的XSLT中都应该有效。