我正在尝试解释查询构建器结构并将其转换为xsl格式。 我打算使用XSL生成另一个XSL结构。为此,我正在使用xsl:namespace-alias标记。
我大致有以下xml结构
<rule>
<criteria>
<queryelement>
<key>employee_id</key>
<op>
<code>eq</code>
<label>Equals</label>
</op>
<value>emp1</value>
</queryelement>
<queryelement>
<code>and</code>
</queryelement>
<queryelement>
<key>salary</key>
<op>
<code>eq</code>
<label>Equals</label>
</op>
<value>10000</value>
</queryelement>
<evaluation>
<value>10</value>
<type>CONSTANT</type>
</evaluation>
</criteria>
<criteria>
<queryelement>
<key>fname</key>
<op>
<code>eq</code>
<label>Equals</label>
</op>
<value>first</value>
</queryelement>
<evaluation>
<value>20</value>
<type>CONSTANT</type>
</evaluation>
</criteria>
</rule>
我需要编写xsl来生成以下输出
预期产出:
<xxx:when test="employee_id eq emp1 and salary eq 10000">
<xxx:value-of select="10"/>
</xxx:when>
<xxx:when test="fname eq first">
<xxx:value-of select="20"/>
</xxx:when>
我能够做到的最接近的是使用下面的xsl:
xsl applied:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx">
<xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/>
<xsl:template match="/">
<xsl:for-each select="rule/criteria">
<xxx:when>
<xsl:for-each select="queryelement">
<xsl:choose>
<xsl:when test="code">
<xsl:variable name="code" select="code" />
<xxx:value-of select="{$code}" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="key" select="key" />
<xsl:variable name="code2" select="op/code" />
<xsl:variable name="value" select="value" />
<xxx:value-of select="{$key} {$code2} {$value}" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:variable name="evaluation" select="evaluation/value" />
<xxx:value-of select="{$evaluation}" />
</xxx:when>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
获得的输出:
<xxx:when>
<xxx:value-of select="employee_id eq emp1"/>
<xxx:value-of select="and"/>
<xxx:value-of select="salary eq 10000"/>
<xxx:value-of select="10"/>
</xxx:when>
<xxx:when>
<xxx:value-of select="fname eq first"/>
<xxx:value-of select="20"/>
</xxx:when>
我主要面临的问题是创建一个变量,它累积节点的文本内容并存储到变量中并在测试条件中使用它
答案 0 :(得分:0)
你可以尝试
<xsl:template match="/">
<xsl:for-each select="rule/criteria">
<xxx:when>
<xsl:attribute name="test">
<xsl:apply-templates select="queryelement"/>
</xsl:attribute>
<xsl:variable name="evaluation" select="evaluation/value" />
<xxx:value-of select="{$evaluation}" />
</xxx:when>
</xsl:for-each>
</xsl:template>
<xsl:template match="queryelement">
<xsl:variable name="key" select="key" />
<xsl:variable name="code2" select="op/code" />
<xsl:variable name="value" select="value" />
<xsl:variable name="code" select="code" />
<xsl:choose>
<xsl:when test="code">
<xsl:value-of select="concat(' ', normalize-space($code), ' ')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($key, ' ', $code2, ' ', $value)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>