2013-04-24 3 views
2

У меня есть преобразование, где я пытаюсь записать набор сплющенных данных транзакции, а в конце файла - суммирование сумм, сгруппированных по типу и типу регистра.
Запись набора индивидуальных данных транзакции - это легкая часть, и у меня есть эта работа, но я борюсь с итоговой частью.xslt 1.0 группировка с составными клавишами (на разных уровнях)

Проблема заключается в том, что я не буду знать, что и как много разных номеров регистров есть, или сколько или сколько типов тендеров есть (так что явно перечисление резюме в xslt со статическими фильтрами - это не-go), поэтому какая-то группировка, кажется, в порядке.

еще один ключ - я застрял с помощью XSLT 1.0 ...

Я пытался возиться с muenchian группировки, но и между требованием составного ключа (с регистром живущего на другом уровне, чем метод оплаты) и мой ограниченный понимание того, как работают мауанский метод и ключи, в первую очередь я не мог заставить его работать, но я думаю, что это все еще может быть трюком, необходимым ...

Любые предложения о том, как я могу, Работа?

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

<s0:SalesCollection xmlns:s0="http://mySourceSchema"> 
    <s0:Sale transactionnumber="1" register="1"> 
    <s0:Tender amount="1.11" paymentmethod="visa" /> 
    <s0:Tender amount="2.22" paymentmethod="mastercard" /> 
    </s0:Sale> 
    <s0:Sale transactionnumber="2" register="1"> 
    <s0:Tender amount="5.55" paymentmethod="discover" /> 
    <s0:Tender amount="4.44" paymentmethod="visa" /> 
    </s0:Sale> 
    <s0:Sale transactionnumber="1" register="2"> 
    <s0:Tender amount="9.99" paymentmethod="amex" /> 
    <s0:Tender amount="8.88" paymentmethod="visa" /> 
    </s0:Sale> 
</s0:SalesCollection> 

вот что я иду (опять же, у меня есть запись [@ типа = 'подробно'] записи уже работает):

<ns0:root xmlns:ns0="http://myDestinationSchema"> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="1.11" paymentmethod="visa" /> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="2.22" paymentmethod="mastercard" /> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="5.55" paymentmethod="discover" /> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="4.44" paymentmethod="visa" /> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="9.99" paymentmethod="amex" /> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="8.88" paymentmethod="visa" /> 
    <ns0:record type="summary" register="1" amount="5.55" paymentmethod="visa" /> 
    <ns0:record type="summary" register="1" amount="2.22" paymentmethod="mastercard" /> 
    <ns0:record type="summary" register="1" amount="5.55" paymentmethod="discover" /> 
    <ns0:record type="summary" register="2" amount="9.99" paymentmethod="amex" /> 
    <ns0:record type="summary" register="2" amount="8.88" paymentmethod="visa" /> 
</ns0:root> 

Итак, как мне начать создавать сводные записи, сгруппированные по регистру и способу оплаты с помощью xslt 1.0?

ответ

3

Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:s0="http://mySourceSchema" 
xmlns:ns0="http://myDestinationSchema" exclude-result-prefixes="s0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kTendByTypeAndReg" match="s0:Tender" 
    use="concat(../@register, '#', @paymentmethod)"/> 

<xsl:template match="/*"> 
    <ns0:root xmlns:ns0="http://myDestinationSchema"> 
    <xsl:apply-templates select="*/*"/> 
    <xsl:apply-templates mode="group" select= 
    "*/*[generate-id() 
     =generate-id(key('kTendByTypeAndReg', 
         concat(../@register, '#', @paymentmethod))[1] 
         ) 
     ]"/> 
    </ns0:root> 
</xsl:template> 

<xsl:template match="s0:Tender"> 
    <ns0:record type="detail" transactionnumber="{../@transactionnumber}" 
     register="{../@register}" amount="{@amount}" paymentmethod="{@paymentmethod}" /> 
</xsl:template> 

<xsl:template match="*" mode="group"> 
    <ns0:record type="summary" register="{../@register}" paymentmethod="{@paymentmethod}" 
    amount="{sum(key('kTendByTypeAndReg',concat(../@register,'#',@paymentmethod)) 
        /@amount)}"/> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML:

<s0:SalesCollection xmlns:s0="http://mySourceSchema"> 
    <s0:Sale transactionnumber="1" register="1"> 
    <s0:Tender amount="1.11" paymentmethod="visa" /> 
    <s0:Tender amount="2.22" paymentmethod="mastercard" /> 
    </s0:Sale> 
    <s0:Sale transactionnumber="2" register="1"> 
    <s0:Tender amount="5.55" paymentmethod="discover" /> 
    <s0:Tender amount="4.44" paymentmethod="visa" /> 
    </s0:Sale> 
    <s0:Sale transactionnumber="1" register="2"> 
    <s0:Tender amount="9.99" paymentmethod="amex" /> 
    <s0:Tender amount="8.88" paymentmethod="visa" /> 
    </s0:Sale> 
</s0:SalesCollection> 

производит желаемый результат:

<ns0:root xmlns:ns0="http://myDestinationSchema"> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="1.11" paymentmethod="visa"/> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="2.22" paymentmethod="mastercard"/> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="5.55" paymentmethod="discover"/> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="4.44" paymentmethod="visa"/> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="9.99" paymentmethod="amex"/> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="8.88" paymentmethod="visa"/> 
    <ns0:record type="summary" register="1" paymentmethod="visa" amount="5.55"/> 
    <ns0:record type="summary" register="1" paymentmethod="mastercard" amount="2.22"/> 
    <ns0:record type="summary" register="1" paymentmethod="discover" amount="5.55"/> 
    <ns0:record type="summary" register="2" paymentmethod="amex" amount="9.99"/> 
    <ns0:record type="summary" register="2" paymentmethod="visa" amount="8.88"/> 
</ns0:root> 

Объяснение:

Правильное использование:

  1. Muenchian Grouping method.

  2. AVT s (Шаблоны значений атрибутов).

+1

Использование сложного группового ключа очень полезно! –

+0

@ J.Polfer, добро пожаловать. –

1

Когда XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns0="http://myDestinationSchema" 
    xmlns:s0="http://mySourceSchema" 
    exclude-result-prefixes="s0" 
    version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key 
    name="kTenderByRegisterAndMethod" 
    match="s0:Tender" 
    use="concat(parent::*/@register, '+', @paymentmethod)"/> 

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

    <xsl:template match="/*"> 
    <ns0:root> 
     <xsl:apply-templates select="*/s0:Tender"/> 
     <xsl:apply-templates 
     select="*/s0:Tender[generate-id() = 
          generate-id(key(
           'kTenderByRegisterAndMethod', 
           concat(parent::*/@register, 
            '+', 
            @paymentmethod))[1])]" 
     mode="summary"/> 
    </ns0:root> 
    </xsl:template> 

    <xsl:template match="s0:Tender"> 
    <ns0:record type="detail"> 
     <xsl:apply-templates select="parent::*/@*|@*"/> 
    </ns0:record> 
    </xsl:template> 

    <xsl:template match="s0:Tender" mode="summary"> 
    <ns0:record type="summary" register="{parent::*/@register}"> 
     <xsl:attribute name="amount"> 
     <xsl:value-of 
      select="sum(
        key('kTenderByRegisterAndMethod', 
         concat(parent::*/@register, 
         '+', @paymentmethod))/@amount)"/> 
     </xsl:attribute> 
     <xsl:apply-templates select="@*[not(name() = 'amount')]"/> 
    </ns0:record> 
    </xsl:template> 
</xsl:stylesheet> 

... применяется к исходному XML:

<s0:SalesCollection xmlns:s0="http://mySourceSchema"> 
    <s0:Sale transactionnumber="1" register="1"> 
    <s0:Tender amount="1.11" paymentmethod="visa"/> 
    <s0:Tender amount="2.22" paymentmethod="mastercard"/> 
    </s0:Sale> 
    <s0:Sale transactionnumber="2" register="1"> 
    <s0:Tender amount="5.55" paymentmethod="discover"/> 
    <s0:Tender amount="4.44" paymentmethod="visa"/> 
    </s0:Sale> 
    <s0:Sale transactionnumber="1" register="2"> 
    <s0:Tender amount="9.99" paymentmethod="amex"/> 
    <s0:Tender amount="8.88" paymentmethod="visa"/> 
    </s0:Sale> 
</s0:SalesCollection> 

... разыскиваемый результат получается:

<ns0:root xmlns:ns0="http://myDestinationSchema"> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="1.11" paymentmethod="visa"/> 
    <ns0:record type="detail" transactionnumber="1" register="1" amount="2.22" paymentmethod="mastercard"/> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="5.55" paymentmethod="discover"/> 
    <ns0:record type="detail" transactionnumber="2" register="1" amount="4.44" paymentmethod="visa"/> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="9.99" paymentmethod="amex"/> 
    <ns0:record type="detail" transactionnumber="1" register="2" amount="8.88" paymentmethod="visa"/> 
    <ns0:record type="summary" register="1" amount="5.55" paymentmethod="visa"/> 
    <ns0:record type="summary" register="1" amount="2.22" paymentmethod="mastercard"/> 
    <ns0:record type="summary" register="1" amount="5.55" paymentmethod="discover"/> 
    <ns0:record type="summary" register="2" amount="9.99" paymentmethod="amex"/> 
    <ns0:record type="summary" register="2" amount="8.88" paymentmethod="visa"/> 
</ns0:root> 

Пояснение

Вы были на правильном пути, чтобы изучить Muenchian Grouping. Обратите внимание на составной ключ, который я использовал, который соответствует s0:Tender элементам, путем объединения значения @register своего родителя, знака «+» (для удобства и обеспечения того, что конкатенация никогда не искажается) и их значение @paymentmethod.

Stick с группой Muenchian Grouping, даже если это не самая простая концепция, чтобы понять сразу же с места в карьер. Я, сам, узнал, посмотрев на Muenchian Grouping-related questions on SO и попытавшись ответить на них; со временем он начал проясняться для меня.

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