将一长段重复的 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:variablexsl: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/>