You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写XSL以输出固定位置文本文件?

Convert XML Employee Benefit Data to Fixed-Position Text File

Based on your XML input and fixed-position requirements, here's a practical, step-by-step solution to generate the desired output:

Key Requirements Recap

  • Each dependent record gets its own line, prepended with the associated employee's details
  • All fields adhere to specified lengths (truncating long values or padding short ones with spaces)
  • New employee records start on a fresh line

Approach

  1. Parse the XML: Extract core employee details and their nested dependent records from the XML structure
  2. Format Lines: For every dependent, build a line by aligning each field to its required length
  3. Generate Output: Compile all formatted lines into the final text file (or print directly)

Python Implementation

Here's a complete script that handles this conversion:

import xml.etree.ElementTree as ET

# Replace with your XML file path or raw XML string
xml_content = """<?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>"""

root = ET.fromstring(xml_content)
output_lines = []

# Loop through all employee records (handles multiple employees)
for employee in root.findall('.//Benefit_1_Detail_Record'):
    emp_id = employee.find('Emplyee_Person_Number').text.strip()
    first_name = employee.find('Employee_First_Name').text.strip()
    last_name = employee.find('Employee_Last_Name').text.strip()
    
    # Get all dependents for this employee
    dependents = employee.findall('.//Benefit_2_Detail_Record')
    
    for dep in dependents:
        parent_id = dep.find('Parent_Employee_Number').text.strip()
        dep_first = dep.find('Dependent_First_Name').text.strip()
        dep_last = dep.find('Dependent_Last_Name').text.strip()
        plan_name = dep.find('Dependent_Plan_Name').text.strip()
        
        # Format each field to exact length (left-align, pad/truncate as needed)
        line = (
            f"{emp_id:<10}"[:10] +
            f"{first_name:<15}"[:15] +
            f"{last_name:<15}"[:15] +
            f"{parent_id:<10}"[:10] +
            f"{dep_first:<15}"[:15] +
            f"{dep_last:<15}"[:15] +
            f"{plan_name:<15}"[:15]
        )
        output_lines.append(line)

# Print output or save to file
print('\n'.join(output_lines))

# To save to a text file:
# with open('benefit_output.txt', 'w') as f:
#     f.write('\n'.join(output_lines))

Expected Output

Running this script produces the exact format you requested:

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

Notes

  • The script uses Python's built-in XML parser and string formatting to ensure strict adherence to field lengths
  • It handles multiple employees automatically (just add more Benefit_1_Detail_Record elements to the XML)
  • Adjust the XML input source to read from a file using ET.parse('your_file.xml').getroot() if needed

内容的提问来源于stack exchange,提问作者Techie Wiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:47:25