将一长段重复的 XSLT 分配给变量
Assign long piece of repeated XSLT to variable
我正在使用此模板将一些 XML 转换为 SQL 查询。它做了它应该做的事。
<xsl:template match="link-info">
UNION<br/>
SELECT
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term, thesau_term.term,<br/>
COUNT(<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term) AS frequency<br/>
FROM <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/><br/>
INNER JOIN thesau_term on <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term = thesau_term.priref<br/>
GROUP BY <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term, thesau_term.term
<br/>
</xsl:template>
该模板为一大堆 table 生成 SELECT
个子句。如您所见,table 名称是从 XML 构造的,使用:
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>
重复5次。不干。现在,xsl:variable
和 xsl:param
似乎都不是为了让事情更具可读性,比如
<xsl:mysnippet name="table_name">
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>
</xsl:mysnippet>
然后在需要时用类似这样的长句来代替。
<xsl:mysnippet name="$table_name" />
在 XSLT 1.0 中有什么方法可以做到这一点吗?
这就是我在 XSLT 3.0 中的写法
<xsl:template match="link-info" expand-text="yes">
<xsl:variable name="name_tag" select="concat(//database-info/@name,
key('Tagkey', forwardreferencetag))" as="xs:string"/>
UNION<br/>
SELECT {$name_tag}.term, thesau_term.term,<br/>
COUNT({$name_tag}.term) AS frequency<br/>
FROM {$name_tag}><br/>
INNER JOIN thesau_term on {$name_tag}.term = thesau_term.priref<br/>
GROUP BY {$name_tag}.term, thesau_term.term
<br/>
</xsl:template>
在 XSLT 1.0 中你不能做大括号扩展文本的事情,但是变量仍然是一个很大的改进:
SELECT <xsl:value-of select="$name_tag"/>.term, thesau_term.term,<br/>
我正在使用此模板将一些 XML 转换为 SQL 查询。它做了它应该做的事。
<xsl:template match="link-info">
UNION<br/>
SELECT
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term, thesau_term.term,<br/>
COUNT(<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term) AS frequency<br/>
FROM <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/><br/>
INNER JOIN thesau_term on <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term = thesau_term.priref<br/>
GROUP BY <xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>.term, thesau_term.term
<br/>
</xsl:template>
该模板为一大堆 table 生成 SELECT
个子句。如您所见,table 名称是从 XML 构造的,使用:
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>
重复5次。不干。现在,xsl:variable
和 xsl:param
似乎都不是为了让事情更具可读性,比如
<xsl:mysnippet name="table_name">
<xsl:value-of select="//database-info/@name"/>_<xsl:value-of select="key('Tagkey', forwardreferencetag)"/>
</xsl:mysnippet>
然后在需要时用类似这样的长句来代替。
<xsl:mysnippet name="$table_name" />
在 XSLT 1.0 中有什么方法可以做到这一点吗?
这就是我在 XSLT 3.0 中的写法
<xsl:template match="link-info" expand-text="yes">
<xsl:variable name="name_tag" select="concat(//database-info/@name,
key('Tagkey', forwardreferencetag))" as="xs:string"/>
UNION<br/>
SELECT {$name_tag}.term, thesau_term.term,<br/>
COUNT({$name_tag}.term) AS frequency<br/>
FROM {$name_tag}><br/>
INNER JOIN thesau_term on {$name_tag}.term = thesau_term.priref<br/>
GROUP BY {$name_tag}.term, thesau_term.term
<br/>
</xsl:template>
在 XSLT 1.0 中你不能做大括号扩展文本的事情,但是变量仍然是一个很大的改进:
SELECT <xsl:value-of select="$name_tag"/>.term, thesau_term.term,<br/>