2011-10-27 42 views
2

我正在做一個非常簡單的xslt將html頁面轉換爲xml文件。XHTML到XML XSLT轉換

但在我看來,起點對我來說並不那麼簡單。我的第一個目標是將<html>標記轉換爲<topic>標記。

我做了以下XSLT:

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

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

<xsl:template match="html"> 
    <topic> 
    <xsl:text> Conversion Test</xsl:text> 
    </topic> 
</xsl:template> 

不過,現在我運行這個XSLT後,結果XML是純粹原始的HTML頁面的內容相同的,好像是第三個模板匹配,我寫(匹配<html>標籤)永遠不會被擊中。

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>..</head> 
    <body>...</body> 
</html> 

專家能幫助我一點嗎?

+0

你能舉一個你的html的例子嗎? (特別是任何命名空間像'xmlns =「http://www.w3.org/1999/xhtml」') –

+0

@DevNull,我更新了我的問題與源HTML – Kevin

+0

謝謝。好問題+1 –

回答

4

XSLT 1.0:

嘗試增加xmlns:x="http://www.w3.org/1999/xhtml"xsl:stylesheet和改變你的比賽match="x:html"。 (注:你沒有用「X」,你可以選擇你想要的任何東西。)

XSLT 2.0:

要麼用上面的方法或者在你的對手(ES更換命名空間前綴)改爲「*」(match="*:html")。您還可以將xpath-default-namespace="http://www.w3.org/1999/xhtml"添加到xsl:stylesheet

+0

謝謝,它的工作!是的,這個html實際上是xhtml,我使用XSLT1.0,放入你建議的命名空間之後,效果很好:) – Kevin

+0

我更新了標題以反映源文檔的性質。 – Kevin

+1

@凱文 - 你非常歡迎。另外,如果您不想在XML輸出中使用名稱空間,請將'exclude-result-prefixes =「#all」'添加到'xsl:stylesheet'。 (注意:你可以用'x'替換'#all'來特別排除'x'。 –

0

您可能想要嘗試刪除第一個模板或使其與使用node()匹配每個節點的模板更具體。

+0

你是說刪除身份轉換嗎? –

+0

@lkuty,我嘗試刪除第一個模板。現在生成的XML只是一個沒有任何標記的文本大節點。它包含原始html頁面中的所有文本。 – Kevin

+0

我錯了。我認爲可以選擇第一條規則,但實際上,匹配模式的默認優先級大於'node()',因此它不會成爲問題。我只是沒有想到NS。 – lkuty

0

XSLT的目的是將XML文檔轉換爲其他XML文檔。 HTML不是一個XML文檔。雖然XHTML是XML,但它實際上是HTML重新構建的,所以我只是不確定要使用XSLT執行簡單或可能的操作。

+0

所以現在你更新標題:)。這反映了我的問題。 – Rob