2016-02-10 5 views
1

В результате я хочу это:XSLT 1.0 Преобразование структуры вопрос

Для каждого //root/document/ins/@contractId, который имеет матч с //root/document/DetailGroup/Detail/Order/contract/@contractId и DetailSubtype является грубым, order type=Surrender.

Информация о транзакции должна быть суммирована. Сумма, которую необходимо суммировать, должна ТОЛЬКО быть full_sur и partial_sur, все остальное должно быть проигнорировано

И они хотят иметь конкретную структуру, один раз для каждой логики соответствия.

Первый файл XML, который должен быть преобразован:

<Document> 
     <ins contractId="670"> 
      <Role> 
      <person personId="60"/> 
      <role>INS</role> 
      </Role> 
     </ins> 
     <ins contractId="477"> 
      <Role> 
      <person personId="60"/> 
      <role>OWN</role> 
      </Role> 
     </ins> 
     <DetailGroup> 
      <Detail type="detailgross" DetailId="25"> 
       <DetailSubtype>GROSS</DetailSubtype> 
       <Order type="Surrender"> 
        <contract contractId="477"/> 
        <Transaction> 
         <Transaction> 
          <completedAmount>1443.08</completedAmount> 
          <TransactionSubtype>yield</TransactionSubtype> 
         </Transaction> 
         <Transaction> 
          <completedAmount>100.00</completedAmount> 
          <TransactionSubtype>fee</TransactionSubtype> 
         </Transaction> 
         <Transaction> 
          <completedAmount>200.00</completedAmount> 
          <TransactionSubtype>full_sur</TransactionSubtype> 
         </Transaction> 
        </Transaction> 
       </Order> 
      </Detail>  

      <Detail type="detailgross" DetailId="24"> 
       <DetailSubtype>gross</DetailSubtype> 
       <Order type="Surrender"> 
        <contract contractId="670"/> 
        <Transaction> 
         <Transaction> 
          <completedAmount>1443.08</completedAmount> 
          <TransactionSubtype>fee</TransactionSubtype> 
         </Transaction> 
         <Transaction> 
          <completedAmount>100.00</completedAmount> 
          <TransactionSubtype>full_sur</TransactionSubtype> 
         </Transaction> 
         <Transaction> 
          <completedAmount>1000.00</completedAmount> 
          <TransactionSubtype>partial_sur</TransactionSubtype> 
         </Transaction> 
        </Transaction> 
       </Order> 
      </Detail> 

    </DetailGroup> 
    </Document> 

И тогда, как им это нужно смотреть:

<root> 
     <document> 
      <person role="INS" personId="60"> 
      </person> 
      <bet> 
       <spar> 
        <at sum="1100"/> 
       </spar> 
      </bet> 
     </document> 
     <document> 
      <person role="OWN" personId="60"> 
      </person> 
      <bet> 
       <spar> 
        <at sum="200"/> 
       </spar> 
      </bet> 
     </document> 
    </root> 

EDIT: Я могу только использовать XSLT 1.0

<xsl:template name="example"> 
<xsl:variable name="detailId" select="//Document/DetailGrooup/Detail/Order/contract"/> 
<xsl:for-each select="//Document/ins[@contractId=$detailId/@contractId]"> 
<document> 
<person> 
<xsl:attribute name="Role"> 
<xsl:value-of select="//Document/Role"/> 
</xsl:attribute> 
<xsl:attribute name="personId"> 
<xsl:value-of select="//Document/Role/Person/@PersonId"/> 
</xsl:attribute> 

</person> 
<bet> 
<spar> 
<xsl:if test=".././DetailGrooup/Detail[DetailSubtype='GROSS' and ./Order/@type='Surrender' and /Order/Transaction/Transaction/TransactionSubtype='full_sur']"> 
<xsl:attribute name="at"> 
<xsl:value-of select="sum(//Document/DetailGrooup/Detail/Order[/contract/@contractId='@contractId']/Transaction/Transaction/completedAmount)" 
</xsl:attribute> 
</xsl:if> 
</spar> 
</bet> 

</document> 
</xsl:for-each> 


</xsl:template> 
+2

В чем вопрос? Я вижу только требования. Можете ли вы добавить XSLT, который вы пробовали, и объяснить, где у вас проблемы? –

+0

Привет! Извините за поздний ответ, я отредактирую несколько, что я пытаюсь сделать, и провалился. Проблема im имеет совмещение правильных contractIds вместе. –

ответ

1

попробуйте этот

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <!-- use a key to match contractId attributes --> 
    <xsl:key name="kContract" match="Order" use="contract/@contractId"/> 

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

    <xsl:template match="Document"> 
     <root> 
      <xsl:apply-templates/> 
     </root> 
    </xsl:template> 

    <xsl:template match="ins"> 
     <document> 
      <person role="{descendant::role}" personId="{descendant::person/@personId}"/> 
      <bet> 
       <spar> 
        <at> 
         <xsl:attribute name="sum"> 
          <xsl:value-of select="sum(key('kContract', @contractId)/descendant::completedAmount[parent::Transaction[TransactionSubtype = 'full_sur' or TransactionSubtype = 'partial_sur']])"/> 
         </xsl:attribute> 
        </at> 
       </spar> 
      </bet> 
     </document> 
    </xsl:template> 

    <xsl:template match="DetailGroup"/> 

</xsl:stylesheet> 
+0

Я думаю, что использование ключей на самом деле делает работу, в которой я нуждаюсь :) Спасибо! –

+1

http://stackoverflow.com/help/accepted-answer –

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