Я использую xsl для преобразования групповых записей, чтобы они отображались в виде нескольких записей, а оставшиеся записи отображаются один раз и выводят результаты в текстовый файл.
XML:
<?xml version="1.0" encoding="utf-8" ?>
<ed:Fin_Data xmlns:ed="urn:com.ad.report/psrpt">
<ed:Data_Entry>
<ed:Name>Ione Sys</ed:Name>
<ed:EAddress>111 Old Blvd. Ste 1
CITY, ST 12345
</ed:EAddress>
<ed:Business_Phone>+1 (111) 9999999</ed:Business_Phone>
<ed:Pay_Rate>Temporary</ed:Pay_Rate>
<ed:HAddress>1111 SW Old TER
CITY, ST 12345
</ed:HAddress>
<ed:Name>Idle Bain</ed:Name>
<ed:ID>X23675</ed:ID>
<ed:Location>New Blvd.</ed:Location>
<ed:Start_Date>2018-02-01</ed:Start_Date>
<ed:End_Date>2018-02-15</ed:End_Date>
<ed:Pay_Date>2018-02-28</ed:Pay_Date>
<ed:Prs_Lss>
<ed:Type>Prs</ed:Type>
<ed:Amt>3244.09</ed:Amt>
<ed:YTD>12785.37</ed:YTD>
</ed:Prs_Lss>
<ed:Prs_Lss>
<ed:Type>Lss</ed:Type>
<ed:Amt>1301.94</ed:Amt>
<ed:YTD>2864.17</ed:YTD>
</ed:Prs_Lss>
</ed:Data_Entry>
</ed:Fin_Data>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ed="urn:com.ad.report/psrpt">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="linefeed" select="'
'"></xsl:variable>
<xsl:template match="/ed:Fin_Data">
<xsl:text>"Name"|"EAddress"|"BusinessPhone"|"PayRate"|"HAddress"|"Name"|"ID"|"Location"|"StartDate"|"EndDate"|"PayDate"|"PrsType"|"PrsAmt"|"PrsYTD"|"LssType"|"LssAmt"|"LssYTD"</xsl:text>
<xsl:apply-templates select="ed:Data_Entry/ed:Prs_Lss"/>
</xsl:template>
<xsl:template match="ed:Data_Entry">
<xsl:value-of select="$linefeed"/>
<xsl:text>"</xsl:text>
<xsl:value-of select="ed:Name"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:EAddress"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:EAddress"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Business_Phone"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Pay_Rate"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:HAddress"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Name"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:ID"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Location"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Start_Date"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:End_Date"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Pay_Date"/>
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="ed:Prs_Lss">
<xsl:value-of select="$linefeed"/>
<xsl:text>"</xsl:text>
<xsl:value-of select="ed:Type"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:Amt"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="ed:YTD"/>
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>
Результат:
"Name"|"EAddress"|"BusinessPhone"|"PayRate"|"HAddress"|"Name"|"ID"|"Location"|"StartDate"|"EndDate"|"PayDate"|"PrsType"|"PrsAmt"|"PrsYTD"|"LssType"|"LssAmt"|"LssYTD"
"Prs"|"3244.09"|"12785.37"
"Lss"|"1301.94"|"2864.17"
Ожидаемый результат:
"Name"|"EAddress"|"BusinessPhone"|"PayRate"|"HAddress"|"Name"|"ID"|"Location"|"StartDate"|"EndDate"|"PayDate"|"PrsType"|"PrsAmt"|"PrsYTD"|"LssType"|"LssAmt"|"LssYTD"
"Ione Sys"|"111 Old Blvd. Ste 1 CITY, ST 12345"|"+1 (111) 9999999"|"Temporary"|"1111 SW Old TER CITY, ST 12345"|"Idle Bain"|"X23675"|"New Blvd."|"2018-02-01"|"2018-02-15"|"2018-02-28"|"Prs"|"3244.09"|"12785.37"
""|""|""|""|""|""|""|""|""|""|""|"Lss"|"1301.94"|"2864.17"
Все элементы под тегом Data_Entry должны отображаться в самой первой записи и в зависимости от количества записей в теге Prs_Lss должны отображаться со всеми записями.В этом примере, поскольку тег Prs_Lss содержит 2 записи, первая запись будет содержать все данные, а вторая будет иметь пробелы до Pay_Date и оставшиеся данные из тега Prs_Lss.