在使用XSL生成另一个XSL时遇到问题

时间:2014-01-21 05:28:29

标签: xml xslt

我正在尝试解释查询构建器结构并将其转换为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>

我主要面临的问题是创建一个变量,它累积节点的文本内容并存储到变量中并在测试条件中使用它

1 个答案:

答案 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>