2008-10-03 93 views
10

我正在探索用於生成Web內容的XML - > XSLT - > HTML meme。我有很少的XSLT經驗。XSLT抽象

我很好奇XSLT有哪些機制可用於處理抽象或「重構」。例如,使用通用HTML和服務端包含,許多頁面可以被模板化並分解到常見的頁眉,導航和頁腳段,並且頁面本身基本上是正文。

通用標記語言JSP,PHP,ASP儘可能讓所有這些段都具有動態內容(例如將用戶名添加到每個標題塊中)。

通過允許您創建標記文件,它可以接受在生成內容時使用的參數,甚至圍繞並處理標記內的內容,JSP甚至更遠。

我很好奇類似的功能是在XSLT中完成的。有哪些設施可以創建可重用的XSLT塊,以創建HTML頁面等內容?

+1

「meme」?我不認爲這意味着你認爲它的意思... – annakata 2008-12-19 21:30:59

回答

14

對於我自己的項目,這是我如何分割我的網頁。有一個template.xsl文件被我的每個XSL導入爲 。大多數頁面只有template.xsl,但由於他們分析的數據類型不同,大多數頁面都需要自己的 。

<page title="Home"> 
    <navigation> 
     <!-- something here --> 
    </navigation> 
    <main> 
     <!-- something here --> 
    </main> 
</page> 

這是我的template.xsl中的一個片段。我在這裏扔了所有常見的東西,然後給我的頁面 通過call-template添加他們自己的信息。

<xsl:template match="/page" name="page"> 
    <html> 
    <head> 
     <title><xsl:value-of select="(@title)" /></title>   
     <xsl:call-template name="css" /> 
     <xsl:call-template name="script" /> 
    </head> 
    <body> 
     <xsl:call-template name="container" /> 
    </body> 
    </html> 
</xsl:template> 

我的css標籤如何響應的例子。請注意,它調用了css-extended. css,只有 具有適用於所有頁面的通用CSS。一些頁面需要更多。那些 可以覆蓋css-extended。請注意,因爲call-template將失敗,如果 頁面調用模板,但沒有在任何地方定義它。

<xsl:template name="css"> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}reset.css" /> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}style.css" /> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" /> 
     <xsl:call-template name="css-extended" /> 
    </xsl:template> 

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets --> 
    <xsl:template name="css-extended" /> 

我的容器將以類似的manner--常見的東西的工作定義,然後將每個頁面 可以只提供一個實現。默認實現在XSL中。 (在content

<xsl:template name="container"> 
     <div id="container"> 
      <xsl:call-template name="header" /> 
      <xsl:call-template name="content" /> 
      <xsl:call-template name="footer" /> 
     </div> 
    </xsl:template> 

    <xsl:template name="content"> 
     <div id="content"> 
      <div id="content-inner"> 
       <xsl:call-template name="sideBar" /> 
       <xsl:call-template name="main" /> 
      </div> 
     </div> 
    </xsl:template> 

    <xsl:template name="main"> 
     <div id="main"> 
      <xsl:apply-templates select="main" /> 
      <xsl:call-template name="main-extended" /> 
     </div> 
    </xsl:template> 

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets --> 
    <xsl:template name="main-extended" /> 

<xsl:template name="footer"> 
     <div id="footer"> 
     <div id="footer-inner"> 
     <!-- Footer content here --> 
     </div> 
     </div> 
</xsl:template> 

它做得很精美,適合我。如果有任何問題我可以爲你解答,請告訴我。

+0

這是非常好的,正是我所期待的,謝謝。 – 2008-10-03 16:41:40

5

模板,包括。

Xsl與任何其他編程語言都非常不同。 Its rule based.

我建議您閱讀關於Xslt的something,然後詢問更多細節。

+0

所有的教程和我見過的處理XSLT「在小」,側重於語法等。這更多的是「現在我知道如何使用它,我怎麼實際應用它「是一種問題。 – 2008-10-03 16:48:18

2

有xsl包含和導入語句,您可以使用它們來抽取部分頁面。 XSLT本身就是可以重現標籤文件類型行爲的東西。你用你想要的標籤編輯你的xml數據文件。同時,你的xsl模板將會知道他們遇到這些標籤後會做些什麼。

2

你可以給模板的名稱,然後通過打電話給他們「調用模板」

在XSLT 2.0中,您可以創建自己的功能(雖然我覺得語法曲折)

一個美妙的研究領域是使用XSLT生成XSLT樣式表。這可以讓您自動化90%樣式表爲樣板的常見轉換場景。爲了做到這一點,你需要熟悉'命名空間別名'。它是擴大你對語言知識的好方法。

+0

我花了一個小時才弄清楚你在這裏說的關於XSLT - > XSLT的內容,但是我終於把它記錄下來了。這也非常聰明。如果XSLT對於你來說不夠抽象,因爲它只是XML,所以它更抽象。 「會寫代碼,寫代碼寫食物的代碼」就像他們說的那樣。謝謝。 – 2008-10-03 16:45:42

+0

不用擔心 - 讓我知道你是否想要一個例子 – 2008-10-03 19:58:12

1

XSLT功能強大,但它與大多數編程語言有很大的不同,它在提供給您的東西方面非常有限,所以您使用另一種語言內置的東西可能需要一些相當複雜的xsl操作才能工作用。我發現the cheatsheet from here在幾周前我經歷了許多XSLT工作時很有用。

不要指望XSLT會做的事情在一個特定的方式,你也許可以找到做這些事情的好辦法,但如果你有太多的一套想法的東西應該如何工作很容易被卡住。

2

XSL是基於在模板上。

XML數據可以在三級「重用」。在最基本的層面上,你可以通過XML來使用<xsl:for-each />

注意:對於XSL中的每個不循環數據,它只是匹配數據。此外,當您的「內部」一個換每個內,所述XML的「上下文」(類似的編程「範圍」的概念)

使用和重新使用的for-each

的一個例子
<xsl:for-each select="/xml/data/here"> 
    ... do some stuff ... 
</xsl:for-each> 
<xsl:for-each select="/xml/data/here"> 
    ... do some DIFFERENT stuff ... 
</xsl:for-each> 

for-each節點包含在模板節點(第二級重用)中。有兩種類型的模板節點:匹配和命名。 匹配模板節點的行爲與前面提到的每個節點相似,但是如果在XSL處理開始時匹配任何節點,則會自動由模板引擎調用。匹配模板節點也可以明確應用。另一方面命名模板節點總是顯式應用,可以被認爲是相同的功能。一個匹配模板,這將始終被調用(因爲根節點將一直存在)的

<xsl:template match="/"> 
    ... do some stuff ... 
</xsl:template> 

A匹配模板調用另一個匹配模板明確

<xsl:template match="/"> 
    <xsl:apply-templates select="xml/data/too" /> 
</xsl:template> 

<xsl:template match="xml/data/too"> 
    ... do something ... 
</xsl:template> 

注意:在爲了匹配模板的工作,匹配的XML節點需要存在。如果它不存在匹配,那麼調用的模板是而不是

命名模板

<xsl:template name="WriteOut"> 
    ... data with NO Context Here ... 
</xsl:template> 

或從匹配的模板調用一個命名模板

<xsl:template match="/"> 
    <xsl:call-template name="WriteOut" /> 
<xsl:template> 

示例注意:您可以混合和匹配,你打來的,你只要匹配,並命名模板必須注意你在什麼背景下。

所有的模板節點保存在XSL樣式表,你c一個包括導入各種樣式表。例如,您可以將處理HTML頭節點的所有模板放在一個模板中,並將所有模板處理另一個模板中的HTML正文節點。然後,您可以創建一個包含標題和正文樣式表的樣式表。

的實施例包括節點

<xsl:include href="header.xsl" /> 

總之,有三種方法來提取數據塊,通過對於-eaching,通過模板或通過包括的樣式表。