用XSLT转换具有给定parm的给定查询

  • 本文关键字:parm 查询 XSLT 转换 xslt
  • 更新时间 :
  • 英文 :


以下是给定的XML-

<INPUT>
<pSql>select * from cntwrk where moddte>= :from_date and ins_dt &lt; :to_date</parameterizedSql>
<arguments>
<dataType>DATETIME</dataType>
<values>2019-07-24T00:00:01</values>
<key>from_date</key>
</arguments>
<arguments>
<dataType>DATETIME</dataType>
<values>2019-09-23T00:00:01</values>
<key>to_date</key>
</arguments>
</INPUT>

我需要构建一个xslt,以使最终查询具有从cntwrk中选择*,其中moddte>=(to_date('2019-07-24 00:00:01','yyyy-MM-dd HH24:mi:ss'((和
ins_dt<(截止日期('2019-09-23 00:00:01','yyyy-MM-dd HH24:mi:ss'(输出

也就是说,将:from_date替换为串联后的参数/值。

请找到我尝试过的XSLT,但使用变量无法获得所需的输出。


<?xml version="1.0"?>
<xsl:transform exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes" />
<xsl:variable name="q_var" select="INPUT/parameterizedSql" />
<xsl:param name="find_var" select="concat(':',INPUT/arguments/key)" />
<xsl:param name="re_var" select="INPUT/arguments/values" />
<xsl:template match="INPUT">
<xsl:apply-templates select="arguments[dataType[text() = 'DATETIME']]" />
</xsl:template>
<xsl:template match="INPUT">
<xsl:for-each select="//arguments">
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="$q_var" />
<xsl:with-param name="replace" select="$find_var" />
<xsl:with-param name="with" select="$re_var" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="replace-string">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="with" />
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$with" />
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="with" select="$with" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:transform>

这里要学习的第一件事是xsl:for-each不是循环。选定节点集中的每个节点都将单独处理。不能将一个实例的结果传递给另一个实例。

顺序处理给定字符串有两种可能的方法:一种是称为同级递归的技术,另一种是通过命名的递归模板。以下示例将演示第二种方法。

为了简单起见,我假设每个参数在给定的字符串中只出现一次。如果这个假设不成立,那么在调用下一次迭代时,您将需要调用另一个递归模板来实际替换给定字符串中当前处理的参数。

XML(已更正(

<INPUT>
<parameterizedSql>select * from cntwrk where moddte>= :from_date and ins_dt &lt; :to_date</parameterizedSql>
<arguments>
<dataType>DATETIME</dataType>
<values>2019-07-24T00:00:01</values>
<key>from_date</key>
</arguments>
<arguments>
<dataType>DATETIME</dataType>
<values>2019-09-23T00:00:01</values>
<key>to_date</key>
</arguments>
</INPUT>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/INPUT">
<OUTPUT>
<xsl:call-template name="insert-arguments">
<xsl:with-param name="string" select="parameterizedSql"/>
<xsl:with-param name="arguments" select="arguments"/>
</xsl:call-template>
</OUTPUT>
</xsl:template>
<xsl:template name="insert-arguments">
<xsl:param name="string"/>
<xsl:param name="arguments"/>
<xsl:choose>
<xsl:when test="$arguments">
<!-- recursive call -->
<xsl:call-template name="insert-arguments">
<xsl:with-param name="string">
<!-- insert current argument -->
<xsl:variable name="argument" select="$arguments[1]" />
<xsl:variable name="search-string" select="concat(':', $argument/key)" />
<xsl:value-of select="substring-before($string, $search-string)"/>
<xsl:value-of select="$argument/values"/>
<xsl:value-of select="substring-after($string, $search-string)"/>
</xsl:with-param>
<xsl:with-param name="arguments" select="$arguments[position() > 1]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<OUTPUT>select * from cntwrk where moddte&gt;= 2019-07-24T00:00:01 and ins_dt &lt; 2019-09-23T00:00:01</OUTPUT>

我看不出您的问题中插入的值需要封装在todate()中的逻辑,所以我跳过了这一部分。

最新更新