2014-09-29 23 views
0

我一直在瀏覽一些XSLT代碼,並開始注意到相當多的重複代碼。因爲我喜歡DRY代碼並且是面向對象的人,所以我想製作一些簡單的函數,併爲這些重複的邏輯調用它們。我的問題是,在某些情況下,我會傳遞10個參數,或者其他的調用只會傳入4.我知道您可以使用默認參數,但有10個參數只是一個函數。在一個正常的OO編程語言中,你需要創建一個包含10個屬性的對象,並通過這個屬性允許屬性增長,而不必更改任何調用者或者一般問題的簽名。我知道我們在xsl中有複雜的類型。所以,我應該爲這些功能單獨的XSD,然後通過它像:作爲參數的對象的XSLT函數

<xsl:function name="foo:doSomething"> 
    <xsl:param name="someComplexType"/> 
    ... 
    <xsl:variable name="field1" select="someComplexType/field1" /> 
</xsl:function> 

但後來我應該怎麼構建我的新類型與一些10不同的選擇?這是甚至是最好的方式嗎?或者我應該只通過所有10個參數?從概念上講,10個不同的參數與一個對象有關,所以這樣做是有道理的,並且看起來更清晰,但我仍然在尋找xslt向前發展的更多最佳實踐。

+0

如果你想與複雜的工作架構類型,那麼您需要像Saxon 9 EE這樣的架構感知處理器。你有嗎?但只要你沒有在'as'屬性中指定一個類型,你就可以傳入任何東西。 – 2014-09-29 19:22:14

+0

我相信我們有一個處理器能夠處理複雜的模式類型。但是,如何創建對象,我是否在使用大型concat語句來執行xsl:variable元素(不知道concat甚至可以採用多少個參數)。在我正在處理的文檔之外生成複雜模式類型的方法是什麼? – 2014-09-29 20:13:39

+0

您將需要在模式中定義任何類型。至於在XSLT代碼中創建實例,這與任何XML完成一樣,只需使用文字或使用'xsl:element'來計算元素名稱即可。所以' ...'。 – 2014-09-29 20:47:00

回答

0

如果要定義一個複雜類型的模式和使用,在XSLT那麼你需要一個感知模式的XSLT 2.0或3.0的處理器一樣撒克遜9企業版。

但是,您可以通過與子元素的元素,而無需使用模式,如使用XSLT 2.0,你可以輕鬆地構建在XSLT代碼的臨時XML節點,如

<xsl:variable name="foo1" as="element(foo)"> 
    <foo> 
    <bar><xsl:value-of select="whatever"/></bar> 
    <baz><xsl:value-of select="whatelse"/></baz> 
    ... 
    </foo> 
</xsl:variable> 
相關問題