2012-11-27 96 views
2

我有一個XSLT(2.0)文件;它接受輸入的XML數據文件並創建DDL/SQL語句。 它工作得很好。但它是一個有點難以維持,因爲它包含了很多像這樣的「CONCAT」語句格式的信息:類似於其他模板引擎(如Velocity)的模板成語?

<xsl:value-of select="concat('CREATE USER ',$username,' IDENTIFIED BY ',$password,';',$nl)"/> 

我寧願做將編碼我的SQL語句在這樣的方式而不是:

<some-enclosing-elements>[...]CREATE USER <username/>, identified by <password/>; [literally a newline here][...]</some-enclosing-elements> 

我將在XML數據文件本身在無論是XSLT或iself數據文件(頂部可能保持高於此格式在「查找」表我不能工作了還沒有哪)。

有沒有一種標準的習慣用法可以讓這種模板化? 任何想法?

順便說一下;該數據文件包含許多不同的用戶創建當然

+1

我想你可以擴大它,就像' textnode textnode ...' – xiaoyi

回答

2

AVT方法對我的口味有點過分。我傾向於依賴隱式連接完成(在2。0)通過XSL:value-of的:

<xsl:value-of select="'CREATE USER', $username, 'identified by', $password"/> 

我在應用中使用了另一種方法,即這種文本模板是顯著是XSLT內基本上寫我自己的模板引擎;具有包含在形式

<message nr="1">CREATE USER <p:user/> IDENTIFIED BY <p:password/></message> 

消息模板的「消息文件」,然後寫模板規則通過替代參數來擴展消息。

+0

謝謝 - 不知道隱含的concat - 很整潔。我會根據第二個建議給出數據,消息+模板想法。乾杯約翰 – monojohnny

+0

好點...我沒有想過爲此使用隱式concat。比我建議的更優雅。 – LarsH

1

@xiaoyi是正確的,顯示主要替代使用concat()。但是,這比concat()更重要,因爲您必須不斷重複<xsl:value-of select="..." />

一個不錯的選擇是使用attribute value templates(AVTS):

[...]CREATE USER {username}, identified by {password}; 
[...] 

全地形車,但僅適用於(某些)屬性,而不是文本節點(直接)。你如何使用它們來達到這個目的?

XSLT 2.0中的一種方法是使用AVT創建具有屬性的新文字結果元素;使用AVT指定該屬性的值;然後選擇新屬性的值:

<xsl:variable name="query"> 
    <dummy val="[...]CREATE USER {username}, identified by {password}; 
[...]" /> 
</xsl:variable> 
<xsl:value-of select="$query//@val" /> 

是的,這是每個格式化字符串一些顯著的開銷,但有字符串中的每場非常小的開銷。你可以做幾個串在一起,就像這樣:

<xsl:variable name="queries"> 
    <q val="[...]CREATE USER {username}, identified by {password}; &#10;[...]" /> 
    <q val="[...]CREATE TABLE {tablename}, blah blah; &#10;[...]" /> 
</xsl:variable> 
<xsl:value-of select="$queries/q[1]/@val" /> 
<xsl:value-of select="$queries/q[2]/@val" /> 

您可以使用位置索引如上,或使用id屬性,以確定每個字符串。

我還沒有看到在其他地方提倡的這種方法,所以我會好奇聽到別人怎麼看待它。

沒關係,只是...

鑑於邁克爾·凱的回答,我不認爲有一個在做這種方式的任何地方所示的簡單的方法。我想這解釋了爲什麼其他人不主張這種方法。 :-)

唯一的情況是我可以想到這種方法仍然可以使用的是,如果您不能使用XSLT 2.0,但您可以訪問nodeset()擴展功能(例如在IE或.NET環境中)。在這種情況下,無論您在/之前的XPath表達式中使用它,您都需要將換成$queries左右。

+0

有趣的想法!乾杯約翰 – monojohnny