2014-11-24 4 views
0

У меня возникли проблемы с динамической группировкой с помощью XSLT.Группа динамически сгенерированных узлов

Моя проблема сложна (я думаю) частично из-за того, что набор узлов, который я пытаюсь преобразовать, динамически генерируется из расширения apache xalan/sql. Я внимательно следил за примером на сайте документации: see link.

Проект XSLT большой; Я включил только самое необходимое ниже:

<xsl:template match="/"> 
    <!-- I omitted the connection management code --> 
    <xsl:variable name="result" select="sql:query($connection, $query)"/> 
    <xsl:apply-templates select="$result/sql/row-set"/> 
</xsl:template> 

<xsl:template match="row"> 
    <xsl:apply-templates select="col"/> 
</xsl:template> 

<xsl:template match="col"> 
    <xsl:value-of select="text()"/> 
</xsl:template> 

В $ результат имеет множество узлов этой структуры:

<sql> 
    <row-set> 
     <row> 
      <col column-label='Name'>Bob</col> 
      <col column-label='Site'>Site1</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
     <row> 
      <col column-label='Name'>Sally</col> 
      <col column-label='Site'>Site2</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
     <row> 
      <col column-label='Name'>Sam</col> 
      <col column-label='Site'>Site1</col> 
      <col column-label='Active'>No</col> 
     </row> 
     <row> 
      <col column-label='Name'>Jeff</col> 
      <col column-label='Site'>Site2</col> 
      <col column-label='Active'>Yes</col> 
     </row> 
    </row-set> 
</sql> 

желаемого результата:

<sql> 
    <row-set> 
     <site> 
      <site-name>Site1</site-name> 
      <active> 
       <name>Bob</name>       
      </active> 
      <in-active> 
       <name>Sam</name> 
      </in-active> 
     </site> 
     <site> 
      <site-name>Site2</site-name> 
      <active> 
       <name>Sally</name> 
       <name>Jeff</name>       
      </active> 
      <in-active/> 
     </site> 
    </row-set> 
</sql> 

У меня было трудное время пытаясь сгруппировать с помощью клавиш a la muenchian с совпадение не допускает переменные:

<xsl:key name="group-site" match="$result/sql/row-set/" use=?> 
+0

Не звучать неприятно, но XSL - это преобразование структурированных XML-документов. С этой точки зрения ваш набор $ $ result вряд ли может предложить какую-либо интересную структуру. – xbug

+0

Поскольку входной XML, по-видимому, является прямым выходом базы данных SQL, я бы предположил, что вы «GROUP BY site», по крайней мере, и отразите этот элемент структуры в XML. – xbug

+0

@xbug - Я согласен с предположением, что XSLT может оказаться не лучшим инструментом. К сожалению, это унаследованный проект, который я увеличиваю. Тем не менее, есть исходный XML-документ, но я его пропустил. Исходный XML содержит узлы, которые необходимы для построения запроса sql $. Мой «Желаемый результат», показанный выше, будет интегрирован с исходным документом для создания нового преобразованного XML. – user2503167

ответ

0

У меня было трудное время, пытаясь сгруппировать с помощью клавиш а-ля muenchian , поскольку матч не позволяет переменные:

Вам не нужно использовать переменную в соответствие определение. Определите ключевой элемент как:

<xsl:key name="row-by-site" match="row" use="col[@column-label='Site']"/> 

Вы должны быть в контексте «документ», созданного в результате выполнения запроса при вызове клавиши функции() - в противном случае он будет искать строки, чтобы соответствовать в документе источника XML ,

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