2016-01-18 7 views
0

У меня возникли проблемы с добавлением группы, разделенной запятыми, в моем скрипте XSLT. Столбец «Застрахованный» - это целевое поле, которое содержит дочерние теги, которые я хотел бы добавить в качестве разделителя с запятой в мой отчет.Отдельная дочерняя группа с группой, использующая XSLT 1.0

Ожидаемое O/P:

Client Sum Insured Report 

UK 
SNo. Policy Number Customer Name Cover Note # Insured   No. of Addendas Sum Insured Total Commission 
1  POL1   ABC    50242   INSA, INS2, INS1 2    40000  65 
2  POL2   XYZ    12345   INSB, INS3   1    30000  30 
Totals :                     70000  95 

US 
SNo. Policy Number Customer Name Cover Note # Insured   No. of Addendas Sum Insured Total Commission 
1      JKL    45678   INSC    0    10000  10 
Totals :                     10000  10 

XML:

<?xml version="1.0" encoding="UTF-8"?><?Siebel-Property-Set EscapeNames="true"?><SiebelMessage MessageId="1-OC05" IntObjectName="Client Sum Insured Report IO" MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical"> 
<ListOfGroupPolicies> 
<GroupPolicies> 
<Addenda>50242-1</Addenda> 
<CommAmt>50</CommAmt> 
<Cover>50242</Cover> 
<Customer>ABC</Customer> 
<Policy>POL1</Policy> 
<SumInsured>10000</SumInsured> 
<InsuredAccnt>INSA</InsuredAccnt> 
<Organization>UK</Organization> 
<ListOfGroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS1</InsuredAccount> 
    <InsuredShare>5</InsuredShare> 
    </GroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS2</InsuredAccount> 
    <InsuredShare>25</InsuredShare> 
    </GroupPolicies_Insured> 
</ListOfGroupPolicies_Insured> 
</GroupPolicies> 
<GroupPolicies> 
<Addenda>50242-2</Addenda> 
<CommAmt>5</CommAmt> 
<Cover>50242</Cover> 
<Customer>ABC</Customer> 
<Policy>POL1</Policy> 
<SumInsured>20000</SumInsured> 
<InsuredAccnt>INSA</InsuredAccnt> 
<Organization>UK</Organization> 
<ListOfGroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS1</InsuredAccount> 
    <InsuredShare>5</InsuredShare> 
    </GroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS2</InsuredAccount> 
    <InsuredShare>25</InsuredShare> 
    </GroupPolicies_Insured> 
</ListOfGroupPolicies_Insured> 
</GroupPolicies> 
<GroupPolicies> 
<Addenda></Addenda> 
<CommAmt>10</CommAmt> 
<Cover>50242</Cover> 
<Customer>ABC</Customer> 
<Policy>POL1</Policy> 
<SumInsured>10000</SumInsured> 
<InsuredAccnt>INSA</InsuredAccnt> 
<Organization>UK</Organization> 
<ListOfGroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS1</InsuredAccount> 
    <InsuredShare>5</InsuredShare> 
    </GroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS2</InsuredAccount> 
    <InsuredShare>25</InsuredShare> 
    </GroupPolicies_Insured> 
</ListOfGroupPolicies_Insured> 
</GroupPolicies> 
<GroupPolicies> 
<Addenda>12345-1</Addenda> 
<CommAmt>20</CommAmt> 
<Cover>12345</Cover> 
<Customer>XYZ</Customer> 
<Policy>POL2</Policy> 
<SumInsured>20000</SumInsured> 
<InsuredAccnt>INSB</InsuredAccnt> 
<Organization>UK</Organization> 
<ListOfGroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS3</InsuredAccount> 
    <InsuredShare>20</InsuredShare> 
    </GroupPolicies_Insured> 
</ListOfGroupPolicies_Insured> 
</GroupPolicies> 
<GroupPolicies> 
<Addenda></Addenda> 
<CommAmt>10</CommAmt> 
<Cover>12345</Cover> 
<Customer>XYZ</Customer> 
<Policy>POL2</Policy> 
<SumInsured>10000</SumInsured> 
<InsuredAccnt>INSB</InsuredAccnt> 
<Organization>UK</Organization> 
<ListOfGroupPolicies_Insured> 
    <GroupPolicies_Insured> 
    <InsuredAccount>INS3</InsuredAccount> 
    <InsuredShare>20</InsuredShare> 
    </GroupPolicies_Insured> 
</ListOfGroupPolicies_Insured> 
</GroupPolicies> 
<GroupPolicies> 
<Addenda></Addenda> 
<CommAmt>10</CommAmt> 
<Cover>45678</Cover> 
<Customer>JKL</Customer> 
<Policy></Policy> 
<SumInsured>10000</SumInsured> 
<InsuredAccnt>INSC</InsuredAccnt> 
<Organization>US</Organization> 
<ListOfGroupPolicies_Insured /> 
</GroupPolicies> 
</ListOfGroupPolicies> 

XSLT Использована

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" indent="yes"/>  
<xsl:template match="/SiebelMessage/ListOfGroupPolicies"> 
    <xsl:text>&#09;&#09;</xsl:text> 
    <xsl:text>Client Sum Insured Report</xsl:text> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:apply-templates select="GroupPolicies[not(preceding-sibling::GroupPolicies/Organization = Organization)]/Organization" /> 
</xsl:template> 
<xsl:template match="GroupPolicies" > 
    <xsl:variable name="count" select="position()"/> 
    <xsl:value-of select="$count"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="Policy"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="Customer"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="Cover"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="InsuredAccount"/> <!-- Comma Separated List of Insured Accounts per Cover--> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="count(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/Addenda[string-length()>0])"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/SumInsured)"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="sum(../GroupPolicies[Organization=current()/Organization and Cover=current()/Cover]/CommAmt)"/> 
    <xsl:text>&#10;</xsl:text>    
</xsl:template> 
<xsl:template match="Organization"> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:text>SNo.</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Policy Number</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Customer Name</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Cover Note #</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Insured</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>No. of Addendas</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Sum Insured</xsl:text> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:text>Total Commission</xsl:text> 
    <xsl:text>&#10;</xsl:text> 
    <xsl:variable name="temp" select="." />   
    <xsl:apply-templates select="//GroupPolicies[Organization = current() and not(preceding-sibling::GroupPolicies/Cover=Cover)]"/> 
    <xsl:text>Totals:</xsl:text> 
    <xsl:text>&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;&#09;</xsl:text><xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/SumInsured)"/> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:value-of select="sum(../../GroupPolicies[Organization=current()]/CommAmt)"/> 
</xsl:template> 
</xsl:stylesheet> 

Может кто-то пожалуйста, помогите мне, если это вообще возможно.

ответ

0
<xsl:value-of select="InsuredAccnt"/> 
    <xsl:for-each select="ListOfGroupPolicies_Insured/GroupPolicies_Insured"> 
     <xsl:sort select="InsuredShare" order="descending" data-type="number"/> 
     <xsl:text>, </xsl:text> 
     <xsl:value-of select="InsuredAccount"/> 
    </xsl:for-each> 

Это, как вы сортировки внутри <xsl:for-each>.

+0

Спасибо, что так много. –

0

Первое, вместо

<xsl:value-of select="InsuredAccount"/> 

вы должны использовать полный относительный путь (начиная с текущего <GroupPolicies> элемента):

<xsl:value-of select="ListOfGroupPolicies_Insured/GroupPolicies_Insured/InsuredAccount"/> 

для доступа к <InsuredAccount> элементу. Но тогда вы все равно получите только первое вхождение в каждый пункт <GroupPolicies>. Поэтому для того, чтобы получить все значения и разделите их запятой, вы должны использовать

<xsl:for-each select="ListOfGroupPolicies_Insured/GroupPolicies_Insured/InsuredAccount"> 
    <xsl:value-of select="."/> 
    <xsl:if test="not(position()=last())">, </xsl:if> 
</xsl:for-each> 
+0

Код OP на самом деле не так уж плох для новичков, и нет оснований быть грубым. Безопаснее всегда помещать текст внутри 'xsl: text':' , '. –

+0

Не значит быть грубым. –

+0

Спасибо Кимми, я думаю, ученый не считает, что я новичок! Хуже того, XSLT выходит за рамки моего профиля работы, и это одноразовое задание, брошенное на меня. Даже существующий код был написан добросердечным членом StackOverflow. Я должен признать, что XSLT очень интересен, особенно когда я вижу красиво отформатированный вывод. Еще раз спасибо. –

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