2012-10-31 37 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