Как создать динамическую группу by в XSL (xsl: для-каждой-группы), где group-by определяется переменной

#xml #variables #xslt #group-by

#xml #переменные #xslt #group-by

Вопрос:

Я хотел бы выполнить динамическую группировку By на основе параметра, доступного в моем XML. Когда я пытаюсь без varaviable, это работает, но если я использую переменную, у меня нет результата. После многих исследований я не нашел решения. Специалисты могут мне помочь? Данные (XML) … выдержка

 <dbquery id="KPI_SUMMARY"> 
    <descriptor> 
        <database>dbnode</database> 
        <originalquery> select something </originalquery> 
        <parameters> 
            <param value="STATUS" name="pR1"/> 
            <param value="PRIORITY" name="pR2"/> 
            <param value="YEAR" name="pC1"/> 
        </parameters> 
        <querystring> select something </querystring> 
    </descriptor> 
    <columns>
        <column name="NBR" type="BIGINT"/>
        <column name="YEAR" type="INTEGER"/>
        <column name="STATUS" type="VARCHAR"/>
        <column name="MISSION_CODE" type="VARCHAR"/>
        <column name="PRIORITY" type="VARCHAR"/>
    </columns>
    <rows> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="H" YEAR="2006" NBR="2"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="A" YEAR="2007" NBR="1"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="H" YEAR="2007" NBR="2"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="E" YEAR="2008" NBR="3"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="A" YEAR="2009" NBR="28"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="P" YEAR="2010" NBR="76"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="D" YEAR="2011" NBR="114"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="A" YEAR="2012" NBR="62"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="D" YEAR="2013" NBR="5"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="A" YEAR="2013" NBR="104"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="B" YEAR="2014" NBR="4"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="H" YEAR="2014" NBR="3"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="P" YEAR="2014" NBR="331"/> 
        <row PRIORITY="None" MISSION_CODE="No Mis" STATUS="E" YEAR="2014" NBR="3"/> 
    </rows>
</dbquery> 
  

Для информации :

 <?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
  

Жестко запрограммированного преобразования

     <xsl:for-each-group select = "//dbquery[@id='KPI_SUMMARY']/rows/row" group-by="@STATUS">
        <xsl:value-of select="current-grouping-key()"/> : <xsl:value-of select="sum(current-group()/@NBR)"/><br/>
    </xsl:for-each-group>
  

Результат в html

 H : 7
A : 195
E : 6
P : 407
D : 119
B : 4
  

Динамическая Трансформация

     <xsl:variable name="VarGpBy">@<xsl:value-of select="//dbquery[1]/descriptor/parameters/param[@name='pR1']/@value"/></xsl:variable>
    Grouping Key : <xsl:value-of select='$VarGpBy'/><br/>
    <xsl:for-each-group select = "//dbquery[@id='KPI_SUMMARY']/rows/row" group-by="$VarGpBy">
        <xsl:value-of select="current-grouping-key()"/> : <xsl:value-of select="sum(current-group()/@NBR)"/><br/>
    </xsl:for-each-group>
  

Результат в html

 Grouping Key : @STATUS
@STATUS : 738
  

При динамическом подходе кажется, что group By использует не атрибут @STATUS, а строку @STATUS
Как я могу решить эту проблему, потому что целью является создание шаблона, который может быть вызван с параметром для выбора группировки

заранее спасибо

Ответ №1:

Определите переменную как <xsl:variable name="att-name" select="//dbquery[1]/descriptor/parameters/param[@name='pR1']/@value"/> , затем используйте

 <xsl:for-each-group select = "//dbquery[@id='KPI_SUMMARY']/rows/row" group-by="@*[local-name() = $att-name]">
    <xsl:value-of select="current-grouping-key()"/> : <xsl:value-of select="sum(current-group()/@NBR)"/><br/>
</xsl:for-each-group>