2012-11-27 97 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