2013-06-11 9 views
0

мне нужно применить XSLT 1.0 преобразование к следующему XML:XSLT 1.0 Группирование

<ProfitLossFinancials> 
    <ProfitLossFinancial> 
    <Year>2013</Year> 
    <Turnover>13</Turnover> 
    <Profit>13</Profit> 
    </ProfitLossFinancial> 
    <ProfitLossFinancial> 
    <Year>2012</Year> 
    <Turnover>12</Turnover> 
    <Profit>12</Profit> 
    </ProfitLossFinancial> 
</ProfitLossFinancials> 
<BalanceSheetFinancials> 
    <BalanceSheetFinancial> 
    <Year>2013</Year> 
    <FixedAssets>13</FixedAssets> 
    </BalanceSheetFinancial> 
    <BalanceSheetFinancial> 
    <Year>2011</Year> 
    <FixedAssets>11</FixedAssets> 
    </BalanceSheetFinancial> 
</BalanceSheetFinancials> 

иметь следующий вывод:

<Financials> 
    <Financial> 
    <Year>2013</Year> 
    <Turnover>13</Turnover> 
    <Profit>13</Profit> 
    <FixedAssets>13</FixedAssets> 
    </Financial> 
    <Financial> 
    <Year>2012</Year> 
    <Turnover>12</Turnover> 
    <Profit>12</Profit> 
    <FixedAssets/> 
    </Financial> 
    <Financial> 
    <Year>2011</Year> 
    <Turnover/> 
    <Profit/> 
    <FixedAssets>11</FixedAssets> 
    </Financial> 
</Financials> 

Как сделать это?

+0

Не ясно, что вы пытаетесь достичь – sajay

+0

@salay - пожалуйста, посмотрите на ожидаемых результатах - мне нужно сгруппировать элементы из разных родителей на год. – jlp

ответ

2

Пожалуйста, попробуйте следующее:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:key name="kFinancialByYear" 
      match="*[self::ProfitLossFinancial or self::BalanceSheetFinancial]" 
      use="Year" /> 
    <xsl:variable name="af" 
       select="//*[self::ProfitLossFinancial or 
          self::BalanceSheetFinancial]"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <Financials> 
     <xsl:apply-templates select="$af[generate-id() = 
             generate-id(key('kFinancialByYear', Year)[1])]" 
          mode="group" /> 
    </Financials> 
    </xsl:template> 

    <xsl:template match="*" mode="group"> 
    <xsl:variable name="thisYearValues" select="key('kFinancialByYear', Year)" /> 
    <Financial> 
     <xsl:apply-templates select="Year" /> 
     <Turnover> 
     <xsl:value-of select="$thisYearValues/Turnover"/> 
     </Turnover> 
     <Profit> 
     <xsl:value-of select="$thisYearValues/Profit"/> 
     </Profit> 
     <FixedAssets> 
     <xsl:value-of select="$thisYearValues/FixedAssets"/> 
     </FixedAssets> 
    </Financial> 
    </xsl:template> 
</xsl:stylesheet> 

При запуске на этом входе:

<n> 
    <ProfitLossFinancials> 
    <ProfitLossFinancial> 
     <Year>2013</Year> 
     <Turnover>13</Turnover> 
     <Profit>13</Profit> 
    </ProfitLossFinancial> 
    <ProfitLossFinancial> 
     <Year>2012</Year> 
     <Turnover>12</Turnover> 
     <Profit>12</Profit> 
    </ProfitLossFinancial> 
    </ProfitLossFinancials> 
    <BalanceSheetFinancials> 
    <BalanceSheetFinancial> 
     <Year>2013</Year> 
     <FixedAssets>13</FixedAssets> 
    </BalanceSheetFinancial> 
    <BalanceSheetFinancial> 
     <Year>2011</Year> 
     <FixedAssets>11</FixedAssets> 
    </BalanceSheetFinancial> 
    </BalanceSheetFinancials> 
</n> 

Результат является:

<Financials> 
    <Financial> 
    <Year>2013</Year> 
    <Turnover>13</Turnover> 
    <Profit>13</Profit> 
    <FixedAssets>13</FixedAssets> 
    </Financial> 
    <Financial> 
    <Year>2012</Year> 
    <Turnover>12</Turnover> 
    <Profit>12</Profit> 
    <FixedAssets></FixedAssets> 
    </Financial> 
    <Financial> 
    <Year>2011</Year> 
    <Turnover></Turnover> 
    <Profit></Profit> 
    <FixedAssets>11</FixedAssets> 
    </Financial> 
</Financials> 
+0

Похоже на меня переполняют ... –

+0

@NilsWerner Это потому, что вы сделали гораздо более короткий ответ, который не работает. – JLRishe

+0

@NilsWerner - это правильное решение, так как оно создает желаемый результат. Он учитывает все возможные поля за каждый возможный год. – ABach

-2
<xsl:template match="ProfitLossFinancials"> 
    <Financials> 
     <xsl:apply-templates select="ProfitLossFinancial"/> 
    </Financials> 
</xsl:template> 

<xsl:template match="ProfitLossFinancial"> 
    <Financial> 
     <xsl:copy-of select="./*"/> 
     <xsl:copy-of select="../../BalanceSheetFinancials/BalanceSheetFinancial[Year = current()/Year]/FixedAssets"/> 
    </Financial> 
</xsl:template> 
+0

Это не дает желаемого результата. – ABach

+0

Маленькая опечатка, исправлена. Кроме того, более полезные описания ошибок оценены. –

+0

К сожалению, это больше, чем небольшая опечатка. Если это единственные два шаблона, которые вы предлагаете, все элементы 'text()' выводятся непосредственно в документ; Кроме того, это создает только два блока «» - блока на 2011 год не хватает. – ABach

1

Вот более простое решение с использованием для- каждый и ключ:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:key match="Year" name="kyears" use="."/> 

    <xsl:template match="/*"> 
     <Financials> 
      <xsl:for-each select="//Year[generate-id() = 
            generate-id(key('kyears', .)[1])]" > 
       <xsl:variable name="year" select="." /> 
       <xsl:variable name="yearData" select="key('kyears', $year)/.." /> 
       <Financial> 
        <xsl:copy-of select="$year"/> 
        <Turnover> 
         <xsl:value-of select="$yearData/Turnover"/> 
        </Turnover> 
        <Profit> 
         <xsl:value-of select="$yearData/Profit"/> 
        </Profit> 
        <FixedAssets> 
         <xsl:value-of select="$yearData/FixedAssets"/> 
        </FixedAssets> 
       </Financial> 
      </xsl:for-each> 
     </Financials> 
    </xsl:template> 

</xsl:stylesheet> 

Какой сгенерирует следующий вывод:

<?xml version="1.0"?> 
<Financials> 
    <Financial> 
    <Year>2013</Year> 
    <Turnover>13</Turnover> 
    <Profit>13</Profit> 
    <FixedAssets>13</FixedAssets> 
    </Financial> 
    <Financial> 
    <Year>2012</Year> 
    <Turnover>12</Turnover> 
    <Profit>12</Profit> 
    <FixedAssets/> 
    </Financial> 
    <Financial> 
    <Year>2011</Year> 
    <Turnover/> 
    <Profit/> 
    <FixedAssets>11</FixedAssets> 
    </Financial> 
</Financials> 
Смежные вопросы