Как создать XSL для вывода текстового файла с фиксированной позицией? - PullRequest
0 голосов
/ 14 мая 2018

Ниже приведен пример XML-файла, который я имею в качестве входных данных:

<?xml version="1.0" encoding="UTF-8"?>
<DATA_DS>
<ARCHIVEACTIONID></ARCHIVEACTIONID>
<DELIVERYOPTIONID></DELIVERYOPTIONID>
<PAYROLLACTIONID></PAYROLLACTIONID>
<FLOWINSTANCENAME>pb21</FLOWINSTANCENAME>
<G_1>
    <PAYROLL_ACTION_ID>665</PAYROLL_ACTION_ID>
    <G_2>
        <FILE_FRAGMENT>
            <Person_Benefit_Extract_Custom>
                <REP_CATEGORY_NAME>Person Benefit Extract Custom</REP_CATEGORY_NAME>
                <parameters>
                    <request_id>300000163751</request_id>
                    <FLOW_NAME>pbtestrun</FLOW_NAME>
                    <legislative_data_group_id/>
                    <effective_date>2018-04-07</effective_date>
                    <start_date/>
                    <report_category_id>300000163719</report_category_id>
                    <action_parameter_group_id/>
                </parameters>
                <Benefit_Child_Data_Group>
                    <OBJECT_ACTION_ID>1074</OBJECT_ACTION_ID>
                    <Person_Benefit_Traversal_Record>
                        <Benefit_Child_Data_Group>
                            <Benefit_1_Detail_Record>
                                <Emplyee_Person_Number>12345</Emplyee_Person_Number>
                                <Employee_First_Name>John</Employee_First_Name>
                                <Employee_Last_Name>Doe</Employee_Last_Name>
                                <Parent_Dependent_Bridge_Data_Group>
                                    <Benefit_1_2_Bridge_Traversal_Record>
                                        <Benefit_2_Child_Data_Group>
                                            <Benefit_2_Detail_Record>
                                                <Parent_Employee_Number>12345</Parent_Employee_Number>
                                                <Dependent_First_Name>Spouse First Name</Dependent_First_Name>
                                                <Dependent_Last_Name>Spouse Last Name</Dependent_Last_Name>
                                                <Dependent_Plan_Name>Medical Plan</Dependent_Plan_Name>
                                            </Benefit_2_Detail_Record>
                                        </Benefit_2_Child_Data_Group>
                                        <Benefit_2_Child_Data_Group>
                                            <Benefit_2_Detail_Record>
                                                <Parent_Employee_Number>12345</Parent_Employee_Number>
                                                <Dependent_First_Name>Child First Name</Dependent_First_Name>
                                                <Dependent_Last_Name>Child Last Name</Dependent_Last_Name>
                                                <Dependent_Plan_Name>Medical Plan</Dependent_Plan_Name>
                                            </Benefit_2_Detail_Record>
                                        </Benefit_2_Child_Data_Group>
                                        <Benefit_2_Child_Data_Group>
                                            <Benefit_2_Detail_Record>
                                                <Parent_Employee_Number>12345</Parent_Employee_Number>
                                                <Dependent_First_Name>Child2 First Name</Dependent_First_Name>
                                                <Dependent_Last_Name>Child2 Last Name</Dependent_Last_Name>
                                                <Dependent_Plan_Name>Medical Plan</Dependent_Plan_Name>
                                            </Benefit_2_Detail_Record>
                                        </Benefit_2_Child_Data_Group>                                           
                                    </Benefit_1_2_Bridge_Traversal_Record>
                                </Parent_Dependent_Bridge_Data_Group>
                            </Benefit_1_Detail_Record>
                        </Benefit_Child_Data_Group>
                    </Person_Benefit_Traversal_Record>
                </Benefit_Child_Data_Group>
            </Person_Benefit_Extract_Custom>
        </FILE_FRAGMENT>
    </G_2>
</G_1>
</DATA_DS>

Выходными данными должен быть текстовый файл с фиксированной позицией, отображаемый следующим образом (если существует зависимый элемент, распечатайте все зависимые элементы).в той же строке - если сотрудник существует, начните печать со следующей строки):

Field                            Start Position            Length
Emplyee_Person_Number            1                         10
Employee_First_Name              11                        15
Employee_Last_Name               16                        15
Parent_Employee_Number           NA                        10  
Dependent_First_Name             NA                        15
Dependent_Last_Name              NA                        15
Dependent_Plan_Name              NA                        15

Пример вывода:

12345     John           Doe            12345     Spouse First NaSpouse Last NamMedical Plan   12345     Child First NamChild Last NameMedical Plan   12345     Child2 First NaChild2 Last NamMedical Plan

Второй, третий ... сотрудники и соответствующие иждивенцы будутпечатать на новых строках.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я думаю, что пуш-программирование в порядке. Это может работать для вас, пока структура вашего XML является статической, даже для пустых значений.

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

<xsl:template match="Benefit_1_Detail_Record">
  <xsl:apply-templates select="node()"/>
  <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="Emplyee_Person_Number">
  <xsl:value-of select="substring(concat(.,'          '), 1, 10)"/>
</xsl:template>

<xsl:template match="Employee_First_Name">
  <xsl:value-of select="substring(concat(., '               '), 1, 15)"/>
</xsl:template>

<xsl:template match="Employee_Last_Name">
  <xsl:value-of select="substring(concat(., '               '), 1, 15)"/>
</xsl:template>

<xsl:template match="Parent_Employee_Number">
  <xsl:value-of select="substring(concat(., '          '), 1, 10)"/>
</xsl:template>

<xsl:template match="Dependent_First_Name">
  <xsl:value-of select="substring(concat(., '               '), 1, 15)"/>
</xsl:template>

<xsl:template match="Dependent_Last_Name">
  <xsl:value-of select="substring(concat(., '               '), 1, 15)"/>
</xsl:template>

<xsl:template match="Dependent_Plan_Name">
  <xsl:value-of select="substring(concat(., '               '), 1, 15)"/>
</xsl:template>
0 голосов
/ 14 мая 2018

Я бы предложил двухфазное преобразование.Сначала создайте таблицу, используя общие теги, скажем,

<table>
  <head>
     ...
  </head>
  <row>
    <cell>..
  </row>...
</table>

Затем преобразуйте ее в представление ASCII с фиксированной шириной.Вы пометили его как xslt 1.0 и xslt 2.0, поэтому трудно понять, что вы хотите.Самый простой способ дополнить строку $ до длины $n состоит в том, чтобы иметь переменную $spaces, содержащую в строке столько пробелов, сколько вам когда-либо понадобится, а затем выполнить substring(concat($s, $spaces), 1, $n).

...