Как определить конкретную группу сотрудников в большом наборе сотрудников и назначить им флаг Y / N - PullRequest
0 голосов
/ 31 октября 2019

Я ищу соответствие определенной группы сотрудников из входного файла, чтобы пройти флаг YES или NO. Он основан на идентификаторе сотрудника

Ниже приведен мой исходный XML и XSLT, который я пытаюсь. В приведенном ниже исходном коде для сотрудников 12121 и 12123 мне нужно пометить их как ДА в столбце утверждающего, иначе это должно быть НЕТ. Для этого требования я пытаюсь использовать функцию сравнения. Однако это не дает мне накопленный результат. Есть ли другой способ ? любая другая функция, которую я могу использовать?

<?xml version='1.0' encoding='UTF-8'?>
<Report_Data>
<Report_Entry>
    <Employee_ID>12121</Employee_ID>
    <Tax_State_Code>NY</Tax_State_Code>
</Report_Entry>
<Report_Entry>
    <Employee_ID>12122</Employee_ID>
    <Tax_State_Code>PA</Tax_State_Code>
</Report_Entry>
<Report_Entry>
    <Employee_ID>12123</Employee_ID>
    <Tax_State_Code>PA</Tax_State_Code>
</Report_Entry>
<Report_Entry>
    <Employee_ID>12124</Employee_ID>
    <Tax_State_Code>PA</Tax_State_Code>
</Report_Entry>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:variable name="comma">
    <xsl:text>,</xsl:text>
</xsl:variable>
<xsl:variable name="nextline">
    <xsl:text>&#xA;</xsl:text>
</xsl:variable>

<xsl:output method="text" omit-xml-declaration="yes"/>

<xsl:template match="/Report_Data">

    <xsl:text>EmployeeID,Approver,TaxState</xsl:text>

    <xsl:value-of select="$nextline"/>
    <xsl:for-each select="Report_Entry">

        <xsl:variable name="listA">
            <xsl:text>"12121","12123"</xsl:text>
        </xsl:variable>

        <xsl:variable name="empid" select="Employee_ID"/>

        <xsl:value-of select="$empid"/>
        <xsl:value-of select="$comma"/>

        <xsl:choose>
            <xsl:when test="compare($empid, $listA)">
                <xsl:text>YES</xsl:text>
            </xsl:when>
            <xsl:otherwise>NO</xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="$comma"/>

        <xsl:value-of select="Tax_State_Code"/>
        <xsl:value-of select="$nextline"/>
    </xsl:for-each>
</xsl:template>

Ожидаемый результат

EmployeeID,Approver,TaxState
12121,YES,NY
12122,NO,PA
12123,YES,PA
12124,NO,PA

Фактический результат, получаемый в данный момент:

EmployeeID,Approver,TaxState
12121,YES,NY
12122,YES,PA
12123,YES,PA
12124,YES,PA

1 Ответ

2 голосов
/ 31 октября 2019

Эта таблица стилей:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:template match="/Report_Data">
        <xsl:value-of 
            select="'EmployeeID,Approver,TaxState',
                    Report_Entry
                        /string-join(
                            (Employee_ID,
                             if (Employee_ID=(12121, 12123)) 
                                then 'YES' 
                                else 'NO',
                             Tax_State_Code),
                            ','
                        )"
            separator="&#xA;"/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

EmployeeID,Approver,TaxState
12121,YES,NY
12122,NO,PA
12123,YES,PA
12124,NO,PA

Примечание : функция compare имеет подпись сдва строковых аргумента (и функция 3-арности с аргументом сопоставления), и вы действительно сравниваете строковое значение Employee_ID elemnt со строковым значением текстового узла $listA '"12121","12123"'. Для сравнения один ко многим вам нужно использовать оператор =.

...