XSLT (XML в CSV): как создать динамическую переменную и ссылаться на нее позже при объединении?

Мне нужно преобразовать XML-файл в CSV через XSLT.

Вот мой XML

<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
<pi:Employee>
    <pi:Summary>
        <pi:Employee_ID>12345</pi:Employee_ID>
        <pi:Name>John Smith</pi:Name>
    </pi:Summary>
</pi:Employee>
<pi:Employee>
    <pi:Summary>
        <pi:Employee_ID>09876</pi:Employee_ID>
        <pi:Name>Jane Rance</pi:Name>
    </pi:Summary>
</pi:Employee>
</pi:Payroll_Extract_Employees>

Вот желаемый результат:

Employee ID,Employee Name
12345,
09876,

Вот мой XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pi="urn:com.workday/picof" exclude-result-prefixes="xsl">

<xsl:output method="text" encoding="x-UTF-16LE-BOM"/>

<xsl:variable name="delimiter" select="','"/>

 <xsl:variable name="EmployeeID">
    <xsl:for-each select="pi:Payroll_Extract_Employees/pi:Employee">
        <xsl:value-of select="pi:Summary/pi:Employee_ID"/>
    </xsl:for-each>
</xsl:variable>

<xsl:variable name="ColumnHeadings">
    <field>Employee ID</field>
    <field>Employee Name</field>
</xsl:variable>

<xsl:param name="headings" select="document('')/*/xsl:variable[@name='ColumnHeadings']/*" />

<xsl:template match="/">

    <xsl:for-each select="$headings">
        <xsl:if test="position() != 1">
            <xsl:value-of select="$delimiter"/>
        </xsl:if>
            <xsl:value-of select="." />
    </xsl:for-each>

    <xsl:text>&#xa;</xsl:text>

    <xsl:for-each select="pi:Payroll_Extract_Employees/pi:Employee">
        <xsl:value-of
            select="concat($EmployeeID,$delimiter)"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
    
</xsl:template>

</xsl:stylesheet>

К сожалению, он возвращает это так:

Employee ID,Employee Name
1234509876,
1234509876,

ВОПРОС: знаете ли вы, как я могу настроить свою переменную, чтобы я мог ссылаться на нее в объединении, и она просто проходила через каждого сотрудника и возвращала три значения? Это переменная из того кода, с которым у меня проблемы (все остальное работает отлично):

<xsl:variable name="EmployeeID">
   <xsl:for-each select="pi:Payroll_Extract_Employees/pi:Employee">
       <xsl:value-of select="pi:Summary/pi:Employee_ID"/>
   </xsl:for-each>
</xsl:variable>

Любая помощь будет оценена!

1 ответ

Решение

Вы делаете это нелегко. Вы создали переменную, которая является узлом документа. Легче создавать шаблоны, которые напрямую преобразуют каждый узел документа.

Попробуйте вот так:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pi="urn:com.workday/picof" exclude-result-prefixes="xsl">

<xsl:output method="text" encoding="x-UTF-16LE-BOM"/>

<xsl:param name="headings" select="document('')/*/xsl:variable[@name='ColumnHeadings']/*" />

<xsl:template match="/">


<!-- Output the headings -->
    <xsl:text>Employee ID,Employee Name</xsl:text>
    <xsl:text>&#xa;</xsl:text>
    
<!-- For each employee -->
    <xsl:for-each select="pi:Payroll_Extract_Employees/pi:Employee">
<!-- Output the value of each element that you need -->
        <xsl:value-of select="pi:Summary/pi:Employee_ID"/>,<xsl:value-of select="pi:Summary/pi:Name"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
    
</xsl:template>

</xsl:stylesheet>
Другие вопросы по тегам