0

私は次のXMLを持っています

    <InvestmentAccount Id="Element01_Source3_Sequqence002" Type="Standard" InvestmentStrategyId="Employer" ParameterOverrideIds="AllocationRateOverride">
      <Investment FundName="Fund032" FundValue="4754.82" />
      <Investment FundName="Fund034" FundValue="4643.48" />
      <Investment FundName="Fund035" FundValue="2509.46" />
      <Investment FundName="Fund038" FundValue="7104.71" />
      <Investment FundName="Fund042" FundValue="4244.08" />
    </InvestmentAccount>
    <InvestmentAccount Id="Element01_Source4_Sequence003" Type="DWPRebate" InvestmentStrategyId="DSS" ParameterOverrideIds="DWPAllocationRateOverride">
      <Investment FundName="Fund032" FundValue="1881.76" />
      <Investment FundName="Fund034" FundValue="1584.18" />
      <Investment FundName="Fund035" FundValue="872.99" />
      <Investment FundName="Fund038" FundValue="2899.53" />
      <Investment FundName="Fund042" FundValue="1762.62" />
    </InvestmentAccount>
     <InvestmentAccount Id="Element01_Source2_Sequence001" Type="Standard" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
      <Investment FundName="Fund032" FundValue="7395.91" />
      <Investment FundName="Fund034" FundValue="7222.72" />
      <Investment FundName="Fund035" FundValue="3903.52" />
      <Investment FundName="Fund038" FundValue="11051.32" />
      <Investment FundName="Fund042" FundValue="6602.54" />
    </InvestmentAccount>
    <InvestmentAccount Id="Element02_Source2_Sequence004" Type="TransferNonPR" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
      <Investment FundName="Fund032" FundValue="1439.29" />
      <Investment FundName="Fund034" FundValue="1614.31" />
      <Investment FundName="Fund035" FundValue="863.68" />
      <Investment FundName="Fund038" FundValue="2153.80" />
      <Investment FundName="Fund042" FundValue="1306.45" />
    </InvestmentAccount>
    <InvestmentAccount Id="Element03_Source2_Sequence005" Type="TransferNonPR" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
      <Investment FundName="Fund032" FundValue="9617.42" />
      <Investment FundName="Fund034" FundValue="10787.03" />
      <Investment FundName="Fund035" FundValue="5771.18" />
      <Investment FundName="Fund038" FundValue="14391.20" />
      <Investment FundName="Fund042" FundValue="8729.81" />
      <Investment FundName="fictiousextra" FundValue="1414" />
    </InvestmentAccount>

私がやりたいのは、InvestmentStrategyId AND Type が上記の最後の 2 の場合と同じであることです (わかりやすくするために並べ替えます) は、FundName が同じであり、ファンドの値を合計する必要があります。この場合、各面に同じものがありますが、各面に余分または少ないものがある場合があります.

その結果、FundName にアクセスする必要があり、FundValue か、または既に合計された値を合計できます。

ヘルプ!

これが私が達成しようとしている出力です。

        <InvestmentAccount Id="Element01_Source3_Sequence002" Type="Standard" InvestmentStrategyId="Employer" ParameterOverrideIds="AllocationRateOverride">
          <Investment FundName="Fund032" FundValue="4754.82" />
          <Investment FundName="Fund034" FundValue="4643.48" />
          <Investment FundName="Fund035" FundValue="2509.46" />
          <Investment FundName="Fund038" FundValue="7104.71" />
          <Investment FundName="Fund042" FundValue="4244.08" />
        </InvestmentAccount>
        <InvestmentAccount Id="Element01_Source4_Sequence003" Type="DWPRebate" InvestmentStrategyId="DSS" ParameterOverrideIds="DWPAllocationRateOverride">
          <Investment FundName="Fund032" FundValue="1881.76" />
          <Investment FundName="Fund034" FundValue="1584.18" />
          <Investment FundName="Fund035" FundValue="872.99" />
          <Investment FundName="Fund038" FundValue="2899.53" />
          <Investment FundName="Fund042" FundValue="1762.62" />
        </InvestmentAccount>
         <InvestmentAccount Id="Element01_Source2_Sequence001" Type="Standard" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
          <Investment FundName="Fund032" FundValue="7395.91" />
          <Investment FundName="Fund034" FundValue="7222.72" />
          <Investment FundName="Fund035" FundValue="3903.52" />
          <Investment FundName="Fund038" FundValue="11051.32" />
          <Investment FundName="Fund042" FundValue="6602.54" />
        </InvestmentAccount>
<!-- THIS ONE IS THE SUMMED COMBINTION DUE TO InvestmentStrategyId and Type being multiply occuring -->
<InvestmentAccount ...>
          <Investment FundName="Fund032" FundValue="11056.71" />
          <Investment FundName="Fund034" FundValue="12401.34" />
          <Investment FundName="Fund035" FundValue="6634.86" />
          <Investment FundName="Fund038" FundValue="16545" />
          <Investment FundName="Fund042" FundValue="10036.26" />
          <Investment FundName="fictiousextra" FundValue="1414" />
</InvestmentAccount>

一方に存在し、他方には存在しないファンド名を含みます。

.net 4.0を使用して実行していることを追加する必要があります

4

2 に答える 2

1

XSLT 1.0は、MuenchianGroupingを利用します。

この場合、あなたは2回グループ化していると思います。まず、InvestmentAccount要素でグループ化するため、次のようなキーが必要になります

<xsl:key name="Accounts" match="InvestmentAccount" 
         use="concat(@Type, '|', @InvestmentStrategyId)" />

次に、アカウント内の投資要素ごとにグループ化する必要もあります。

<xsl:key name="Investments" match="Investment" 
         use="concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName)" />

連結でのパイプの使用に注意してください。これは任意の文字にすることができますが、どの属性にも含まれていない文字である必要があります。

InvestmentAccount要素でグループ化するには、次のように各グループの最初の要素を一致させることができます。

<xsl:apply-templates 
  select="InvestmentAccount[
    generate-id() = 
    generate-id(key('Accounts', concat(@Type, '|', @InvestmentStrategyId))[1])]" />

そして、グループに入ると、次のようなすべての投資要素を取得できます。

 <xsl:apply-templates 
   select="//InvestmentAccount
     [@Type=current()/@Type]
     [@InvestmentStrategyId = current()/@InvestmentStrategyId]/Investment
        [generate-id() = 
         generate-id(key('Investments', 
           concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))[1])]" />

これが完全なXSLTです(Investmentsと呼ばれるルート要素を想定していることに注意してください)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="Accounts" match="InvestmentAccount" use="concat(@Type, '|', @InvestmentStrategyId)" />
   <xsl:key name="Investments" match="Investment" use="concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName)" />

   <xsl:template match="/Investments">
      <xsl:apply-templates select="InvestmentAccount[generate-id() = generate-id(key('Accounts', concat(@Type, '|', @InvestmentStrategyId))[1])]" />
   </xsl:template>

   <xsl:template match="InvestmentAccount">
      <xsl:copy>
         <xsl:copy-of select="@*" />
         <xsl:apply-templates select="//InvestmentAccount[@Type=current()/@Type][@InvestmentStrategyId = current()/@InvestmentStrategyId]/Investment[generate-id() = generate-id(key('Investments', concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))[1])]" />
      </xsl:copy>   
   </xsl:template>

   <xsl:template match="Investment">
      <xsl:copy>
         <xsl:copy-of select="@FundName" />
         <xsl:attribute name="FundValue"><xsl:value-of select="format-number(sum(key('Investments', concat(../@Type, '|', ../@InvestmentStrategyId, '|', @FundName))/@FundValue), '0.00')" /></xsl:attribute>
      </xsl:copy>   
   </xsl:template>

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

サンプルXML(Investmentsのルート要素を含む)に適用すると、次のように出力されます。

<InvestmentAccount Id="Element01_Source3_Sequqence002" Type="Standard" InvestmentStrategyId="Employer" ParameterOverrideIds="AllocationRateOverride">
   <Investment FundName="Fund032" FundValue="4754.82" />
   <Investment FundName="Fund034" FundValue="4643.48" />
   <Investment FundName="Fund035" FundValue="2509.46" />
   <Investment FundName="Fund038" FundValue="7104.71" />
   <Investment FundName="Fund042" FundValue="4244.08" />
</InvestmentAccount>
   <InvestmentAccount Id="Element01_Source4_Sequence003" Type="DWPRebate" InvestmentStrategyId="DSS" ParameterOverrideIds="DWPAllocationRateOverride">
   <Investment FundName="Fund032" FundValue="1881.76" />
   <Investment FundName="Fund034" FundValue="1584.18" />
   <Investment FundName="Fund035" FundValue="872.99" />
   <Investment FundName="Fund038" FundValue="2899.53" />
   <Investment FundName="Fund042" FundValue="1762.62" />
</InvestmentAccount>
   <InvestmentAccount Id="Element01_Source2_Sequence001" Type="Standard" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
   <Investment FundName="Fund032" FundValue="7395.91" />
   <Investment FundName="Fund034" FundValue="7222.72" />
   <Investment FundName="Fund035" FundValue="3903.52" />
   <Investment FundName="Fund038" FundValue="11051.32" />
   <Investment FundName="Fund042" FundValue="6602.54" />
</InvestmentAccount>
<InvestmentAccount Id="Element02_Source2_Sequence004" Type="TransferNonPR" InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
   <Investment FundName="Fund032" FundValue="11056.71" />
   <Investment FundName="Fund034" FundValue="12401.34" />
   <Investment FundName="Fund035" FundValue="6634.86" />
   <Investment FundName="Fund038" FundValue="16545.00" />
   <Investment FundName="Fund042" FundValue="10036.26" />
   <Investment FundName="fictiousextra" FundValue="1414.00" />
</InvestmentAccount>

グループ化されたInvestmentAccount要素の属性がどのように必要かはわかりませんでしたが、自分で調整できることを願っています。

于 2011-11-23T09:20:05.900 に答える
1

XSLT 2.0 ソリューション:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="InvestmentAccount[1]">
        <xsl:for-each-group select="self::*|following-sibling::InvestmentAccount" group-by="concat(@InvestmentStrategyId,@Type)" >
            <InvestmentAccount Id="{@Id}" Type="{@Type}" InvestmentStrategyId="{@InvestmentStrategyId}" ParameterOverrideIds="{@ParameterOverrideIds}">
                <xsl:for-each-group select="current-group()/Investment" group-by="@FundName">
                    <Investment FundName="{current-grouping-key()}" FundValue="{sum(for $x in current-group()/@FundValue return xs:double(data($x)))}" />
                </xsl:for-each-group>
            </InvestmentAccount>
        </xsl:for-each-group>
    </xsl:template>
    <xsl:template match="InvestmentAccount"/>
</xsl:stylesheet>

XML をルートに挿入する<test></test>と、XSLT の結果は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <InvestmentAccount Id="Element01_Source3_Sequence002" Type="Standard"
        InvestmentStrategyId="Employer" ParameterOverrideIds="AllocationRateOverride">
        <Investment FundName="Fund032" FundValue="4754.82"/>
        <Investment FundName="Fund034" FundValue="4643.48"/>
        <Investment FundName="Fund035" FundValue="2509.46"/>
        <Investment FundName="Fund038" FundValue="7104.71"/>
        <Investment FundName="Fund042" FundValue="4244.08"/>
    </InvestmentAccount>
    <InvestmentAccount Id="Element01_Source4_Sequence003" Type="DWPRebate"
        InvestmentStrategyId="DSS" ParameterOverrideIds="DWPAllocationRateOverride">
        <Investment FundName="Fund032" FundValue="1881.76"/>
        <Investment FundName="Fund034" FundValue="1584.18"/>
        <Investment FundName="Fund035" FundValue="872.99"/>
        <Investment FundName="Fund038" FundValue="2899.53"/>
        <Investment FundName="Fund042" FundValue="1762.62"/>
    </InvestmentAccount>
    <InvestmentAccount Id="Element01_Source2_Sequence001" Type="Standard"
        InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
        <Investment FundName="Fund032" FundValue="7395.91"/>
        <Investment FundName="Fund034" FundValue="7222.72"/>
        <Investment FundName="Fund035" FundValue="3903.52"/>
        <Investment FundName="Fund038" FundValue="11051.32"/>
        <Investment FundName="Fund042" FundValue="6602.54"/>
    </InvestmentAccount>
    <InvestmentAccount Id="Element02_Source2_Sequence004" Type="TransferNonPR"
        InvestmentStrategyId="Employee" ParameterOverrideIds="AllocationRateOverride">
        <Investment FundName="Fund032" FundValue="11056.71"/>
        <Investment FundName="Fund034" FundValue="12401.34"/>
        <Investment FundName="Fund035" FundValue="6634.860000000001"/>
        <Investment FundName="Fund038" FundValue="16545"/>
        <Investment FundName="Fund042" FundValue="10036.26"/>
        <Investment FundName="fictiousextra" FundValue="1414"/>
    </InvestmentAccount>




</test>

注 : InvestmentAccount 属性の値は、Type と InvestmentStrategyId の値が同じである InvestmentAccount のグループ内の最初の要素 InvestmentAccount の 1 つです。これは簡単に変更できます。

于 2011-11-22T22:51:55.627 に答える