2012-10-31 35 views
0

对不起,关于最后一篇文章。使用XSLT在html中选择特定标记并将标记的内容打印到XML

现在我试着更加清楚。

我需要从一个HTML选择一些标签和我有以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
<xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="a"><xsl:apply-templates/></xsl:template> 
<xsl:template match="img"/> 
</xsl:stylesheet> 

这根据我的理解选择从一个HTML网页/文件<a><img>标签和打印标签里面的内容(告诉我,如果我的理解是错误的)。但上面的XSLT输出一个页面的整个html。任何人都可以指出我哪里可能出错,需要做些什么才能使它正确。

谢谢。

+0

除非是HTML已知的一个非常具体的形式,不能使用对HTML XSLT作为XHTML。如果没有,则没有XML解析器会处理它。您可以调查JSoup,它可以从HTML生成XML DOM。 –

回答

1

我认为你的理解并不完全正确。看着在轮到你XSLT模板,您提供标准身份模板

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

这将简单的元素及其属性复制开始,然后继续处理其子元素。因此,如果您的HTML中有一个h1标记,它将按原样输出。

然后,您继续使用a元素的模板。

<xsl:template match="a"><xsl:apply-templates/></xsl:template> 

因为这是比身份模板更具体而言,将优先。在你的情况下,它不会复制a元素,但它会处理它的子元素。假设您的a元素只包含文本,则应根据需要输出。

你最后的模板匹配IMG元素

<xsl:template match="img"/> 

但是,这一切正在做的是完全忽视它。

值得注意的是,XSLT具有内置模板,当它找不到匹配项时使用它。这些不会复制元素,但会继续处理其子元素。所以如果你不想复制所有的HTML元素,你可以只依靠内置的模板,只为你想要采取特定操作的元素添加模板。

我不是100%肯定您的要求,但如果你是只是想借此内一个元素一些XHTML和输出只有文字,你可以使用这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="a/text()"> 
     <xsl:value-of select="." /> 
    </xsl:template> 

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

</xsl:stylesheet> 

所以,<xsl:template match="a/text()">将输出,元素内的文本,而较不具体的<xsl:template match="text()">将忽略所有其他文本。内置模板用于其他元素,如前所述,这不会输出它们,只是处理它的子元素(所以最终会到达文本节点)。

因此,举例来说,如果你有这个HTML

<html> 
    <head> 
    <title>Test</title> 
    </head> 
    <body> 
    <h1>Test</h1> 
    Welcome! 
    <img src="test.jpg" alt="Test Image" /> 
    <p><a href="test.html">Test Link</a></p> 
    </body> 
</html> 

所有这些都是对输出将

Test Link