2014-01-21 2 views
0

Я пытаюсь интерпретировать структуру построителя запросов и преобразовывать его в формат xsl. Я намерен использовать XSL для создания другой структуры XSL. Для этого я использую тег xsl: namespace-alias.Облицовка проблемы при использовании XSL для генерации другого XSL

Я грубо следующую структуру 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 прикладной:

<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

вы могли бы попробовать

<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> 
+0

Хороший ответ, за исключением того, кажется, есть много переменных, которые на самом деле не пе потому что они используются только один раз. –

+0

@MichaelKay Я согласен, но я только следовал предпочтениям OP. –

+0

Спасибо, Джоэл. Оно работает – Ratish

Смежные вопросы