2013-05-07 77 views
2

我想提取html頁面中<head>標記元素之間的所有內容。包括鏈接標籤和腳本標籤。使用XSLT提取HTML元素

假設下面的源代碼是一個片段,它將成爲完整的html文檔的一部分。

來源:

... 
<head> 
<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<script type="text/javascript" src="main.js"></script> 
<script type="text/javascript" src="second.js"></script> 
</head> 
... 

XSLT:

<xsl:output method="xml" encoding="utf-8" indent="no"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="link"/> 
</xsl:template> 

這工作正常,如果只有一個標籤,我試圖讓。有沒有一種方法可以處理所有事情,只有「頭」標籤之間的所有內容。

我預計會是輸出:

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<script type="text/javascript" src="main.js"></script> 
<script type="text/javascript" src="second.js"></script> 
+0

您能否提供一個更完整的源文檔示例,以及您期望的輸出示例? – 2013-05-07 17:38:30

+0

通常,只能在符合XML的數據(如XHTML)上使用XSL。如果你的輸入不是XHTML,你可能會在某個時候得到解析異常。 – 2013-05-07 22:53:53

回答

2

您需要使用XSL 恆等變換

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

與防止一切的輸出,你不想要一個模板一起。

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

第二個模板,更加具體,將匹配根,然後將樣式表應用到<head>標籤的內容。身份轉換將輸出所需的標籤。

+0

+1,比依靠''更加優雅。 – ABach 2013-05-08 00:19:36

0

您需要使用 '的xsl:for-每個' 語句

<xsl:template match="/"> 
     <xsl:for-each select="head/*"> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 
0

我想你可以使用<xsl:for-each>元素來選擇每一個XML元素一個指定的節點集。

只需循環遍歷head標籤中的所有元素,然後使用xsl-current()函數以像這樣的方式獲取每個元素的值; <xsl:value-of select="current()"/>