Re: [xsl] Grouping using concatenated key

Subject: Re: [xsl] Grouping using concatenated key
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Mon, 11 Dec 2006 21:27:35 +0530
David has suggested the right approach..

To add to his answer, I would suggest a key definition like:

<xsl:key name="byObligationAndPhone" match="BillDetail"
use="concat(OBLIGATION_ID, ':', PHONE_NUMBER)" />

This is more safe for a 2 level grouping.

On 12/11/06, jmcreynolds@xxxxxxxxxxxxxx <jmcreynolds@xxxxxxxxxxxxxx> wrote:
All,

I have been wrestling with this problem for about 3 days now.  I have
looked at the examples that Jenni has provided, but I am just not getting
it quite right.



Here is some example XML that I am using:



<BillDetail>

<BILLING_DT>2006-12-01T00:00:00-06:00</BILLING_DT>

<BILL_TO_ACCT_ID>11111</BILL_TO_ACCT_ID>

<ACCT_ID>13893</ACCT_ID>

<PHONE_NUMBER>1234567890</PHONE_NUMBER>

<TO_NUMBER>9876543210</TO_NUMBER>

<TO_CITY>CREVE COEU</TO_CITY>

<TO_STATE>MO</TO_STATE>

<RATE_PERIOD>1</RATE_PERIOD>

<RATE_PERIOD_NAME>Day</RATE_PERIOD_NAME>

<MINUTES>1</MINUTES>

<AMOUNT>0.22</AMOUNT>

<DISCOUNTED_AMT>0.09</DISCOUNTED_AMT>

<SURCHARGE_AMT>0</SURCHARGE_AMT>

<FEDERAL_TAX>0</FEDERAL_TAX>

<STATE_TAX>0</STATE_TAX>

<COUNTY_TAX>0</COUNTY_TAX>

<CITY_TAX>0</CITY_TAX>

<FROM_NUMBER>1234567890</FROM_NUMBER>

<FROM_CITY>NEW HAVEN </FROM_CITY>

<FROM_STATE>MO</FROM_STATE>

<SOURCE>TCSI</SOURCE>

<CIC_ID>444</CIC_ID>

<CALL_DATE_TIME>2006-11-02T14:43:30-06:00</CALL_DATE_TIME>

<CALL_MINUTES>0</CALL_MINUTES>

<CALL_SECONDS>42</CALL_SECONDS>

<BATCH_ID>987</BATCH_ID>

<CALL_ID>135</CALL_ID>

<CATEGORY>1</CATEGORY>

<GROUP_NO>1</GROUP_NO>

<ID_NO>1</ID_NO>

<EMR_MESSAGE_TYPE_ID>1</EMR_MESSAGE_TYPE_ID>

<SETTLEMENT_CODE>8</SETTLEMENT_CODE>

<METHOD_OF_RECORDING>2</METHOD_OF_RECORDING>

<RATE_CLASS>4</RATE_CLASS>

<INDICATORS>000000000000000000500000000000</INDICATORS>

<DISCOUNT_PLAN_IND>*</DISCOUNT_PLAN_IND>

<BILL_GROUP_ID>24</BILL_GROUP_ID>

<SERV_RATE_CODE>FLTAMBVD</SERV_RATE_CODE>

<CALL_INDICATOR_ID>26</CALL_INDICATOR_ID>

<ACCT_DISPLAY_ORDER>6</ACCT_DISPLAY_ORDER>

<OBLIGATION_ID>2345</OBLIGATION_ID>

<FRANCH_TAX>0</FRANCH_TAX>

</BillDetail>

<BillDetail>

<BILLING_DT>2006-12-01T00:00:00-06:00</BILLING_DT>

<BILL_TO_ACCT_ID>11111</BILL_TO_ACCT_ID>

<ACCT_ID>13893</ACCT_ID>

<PHONE_NUMBER>4567891230</PHONE_NUMBER>

<TO_NUMBER>3216549870</TO_NUMBER>

<TO_CITY>WASHINGTON</TO_CITY>

<TO_STATE>MO</TO_STATE>

<RATE_PERIOD>1</RATE_PERIOD>

<RATE_PERIOD_NAME>Day</RATE_PERIOD_NAME>

<MINUTES>1</MINUTES>

<AMOUNT>0.22</AMOUNT>

<DISCOUNTED_AMT>0.09</DISCOUNTED_AMT>

<SURCHARGE_AMT>0</SURCHARGE_AMT>

<FEDERAL_TAX>0</FEDERAL_TAX>

<STATE_TAX>0</STATE_TAX>

<COUNTY_TAX>0</COUNTY_TAX>

<CITY_TAX>0</CITY_TAX>

<FROM_NUMBER>7418529630</FROM_NUMBER>

<FROM_CITY>NEW HAVEN </FROM_CITY>

<FROM_STATE>MO</FROM_STATE>

<SOURCE>TCSI</SOURCE>

<CIC_ID>444</CIC_ID>

<CALL_DATE_TIME>2006-11-03T09:46:04-06:00</CALL_DATE_TIME>

<CALL_MINUTES>0</CALL_MINUTES>

<CALL_SECONDS>24</CALL_SECONDS>

<BATCH_ID>987</BATCH_ID>

<CALL_ID>2812</CALL_ID>

<CATEGORY>1</CATEGORY>

<GROUP_NO>1</GROUP_NO>

<ID_NO>1</ID_NO>

<EMR_MESSAGE_TYPE_ID>1</EMR_MESSAGE_TYPE_ID>

<SETTLEMENT_CODE>8</SETTLEMENT_CODE>

<METHOD_OF_RECORDING>2</METHOD_OF_RECORDING>

<RATE_CLASS>4</RATE_CLASS>

<INDICATORS>000000000000000000500000000000</INDICATORS>

<DISCOUNT_PLAN_IND>*</DISCOUNT_PLAN_IND>

<BILL_GROUP_ID>24</BILL_GROUP_ID>

<SERV_RATE_CODE>FLTAMBVD</SERV_RATE_CODE>

<CALL_INDICATOR_ID>26</CALL_INDICATOR_ID>

<ACCT_DISPLAY_ORDER>6</ACCT_DISPLAY_ORDER>

<OBLIGATION_ID>00000000</OBLIGATION_ID>

<FRANCH_TAX>0</FRANCH_TAX>

</BillDetail>



These are just 2 dummied up records.  What I need to do is group these
records first by OBLIGATION_ID then by PHONENUMBER, and then display the
results.  Here is the key I am trying to use to accomplish this:



<xsl:key name="byObligationAndPhone" match="BillDetail"
use="concat(OBLIGATION_ID, PHONE_NUMBER)" />



I have tried looping through the XML using this key to no avail.  Could
someone steer me in the right direction?



Basically, here is what I am wanting to see:



Begin loop

Calls for OBLIGATION_ID

.

.

.

Calls for PHONE_NUMBER (that has the same OBLIGATION_ID from above)

End Loop



I need to loop through all <BillDetail> nodes, breaking it down by
OBLIGATION_ID, then beneath each OBLIGATION_ID, I need to break it down by
PHONE_NUMBER.



This is my first project using XSLTand I am enjoying it greatly.  If I
could only get over this one hump



Many thanks in advance,



JOHN


--
Regards,
Mukul Gandhi

Current Thread