Как получить два одинаковых значения узла уровня на основе условия, используя XSLT? - PullRequest
0 голосов
/ 02 мая 2019

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

Из приведенного ниже вывода XML: мне нужно сопоставить Worker_Events_Complete_Group -> EffectiveDate с Job_History_group Дата вступления в силу и отображать поля только при ее совпадении.

<Report_Entry>
<Employee_ID>50067</Employee_ID>
<Worker>John Grisolano</Worker>
<Worker_Events_Completed_group>
    <EffectiveDate>2019-01-01</EffectiveDate>
    <DateTimeCompleted>2019-01-09T14:23:06.679-08:00</DateTimeCompleted>
    <Business_Process_Type>Transfer Employee</Business_Process_Type>
</Worker_Events_Completed_group>
<Worker_Events_Completed_group>
    <EffectiveDate>2019-04-01</EffectiveDate>
    <DateTimeCompleted>2019-04-03T07:53:43.965-07:00</DateTimeCompleted>
    <Business_Process_Type>Transfer Employee</Business_Process_Type>
</Worker_Events_Completed_group>
<Job_History_group>
    <Effective_Date>2019-01-01</Effective_Date>
    <Class_of_Instance>Position Snapshot</Class_of_Instance>
    <Scheduled_Weekly_Hours>40</Scheduled_Weekly_Hours>
    <Default_Weekly_Hours>40</Default_Weekly_Hours>
</Job_History_group>
<Job_History_group>
    <Effective_Date>2019-04-01</Effective_Date>
    <Class_of_Instance>Position Snapshot</Class_of_Instance>
    <Scheduled_Weekly_Hours>40</Scheduled_Weekly_Hours>
    <Default_Weekly_Hours>40</Default_Weekly_Hours>
</Job_History_group>
</Report_Entry>

XSLT-код, который я использовал, приведен ниже: но он не работает из-за узлов того же уровня, он не смог войти внутрь Job_History_Group.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:template match="/">
    <ChangeEvent>
        <EmpID><xsl:value-of select="Report_Entry/Employee_ID"/></EmpID>
        <xsl:variable name="Current_Date" select="Report_Entry/Worker_Events_Completed_group/EffectiveDate"/>
        <EventDetails>
            <xsl:for-each select="Report_Entry/Worker_Events_Completed_group">
                <Event>
                    <ChangeEventDate><xsl:value-of select="EffectiveDate"/></ChangeEventDate>
                    <ChangeEntryDate><xsl:value-of select="DateTimeCompleted"/></ChangeEntryDate>
                    <ChangeType><xsl:value-of select="CF_Census_Change_Type"/></ChangeType> 
                    <FTE_Snapshot>
                        <xsl:for-each select="Job_History_group">
                            <Snapshot>
                                <xsl:choose> 
                                    <xsl:when test="$Current_Date = Effective_Date">
                                        <xsl:variable name="swh" select="Scheduled_Weekly_Hours"/>
                                        <xsl:variable name="dwh" select="Default_Weekly_Hours"/>
                                        <Snapshot_EffectiveDate><xsl:value-of select="Effective_Date"/></Snapshot_EffectiveDate>
                                        <Snapshot_FTE><xsl:value-of select="$swh div $dwh * 100"/></Snapshot_FTE>
                                    </xsl:when>
                                    <xsl:otherwise/>
                                </xsl:choose>
                            </Snapshot>
                        </xsl:for-each>
                    </FTE_Snapshot>
                </Event>

            </xsl:for-each> 
        </EventDetails>
    </ChangeEvent>
   </xsl:template>
</xsl:stylesheet>

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

<?xml version="1.0" encoding="UTF-8"?>
<ChangeEvent >
<EmpID>50067</EmpID>
<EventDetails>
    <Event>
        <ChangeEventDate>2019-01-01</ChangeEventDate>
        <ChangeEntryDate>2019-01-09T14:23:06.679-08:00</ChangeEntryDate>
        <ChangeType>Cost Center</ChangeType>
        <FTE_Snapshot>
            <Snapshot>   
                <Effective_Date>2019-01-01</Effective_Date>
                <Class_of_Instance>Position Snapshot</Class_of_Instance>
                <Scheduled_Weekly_Hours>40</Scheduled_Weekly_Hours>
                <Default_Weekly_Hours>40</Default_Weekly_Hours>
            </Snapshot>
        </FTE_Snapshot>
    </Event>
    <Event>
        <ChangeEventDate>2019-04-01</ChangeEventDate>
        <ChangeEntryDate>2019-04-03T07:53:43.965-07:00</ChangeEntryDate>
        <ChangeType>Cost Center</ChangeType>
        <FTE_Snapshot>
          <Snapshot>
            <Effective_Date>2019-04-01</Effective_Date>
            <Class_of_Instance>Position Snapshot</Class_of_Instance>
            <Scheduled_Weekly_Hours>40</Scheduled_Weekly_Hours>
            <Default_Weekly_Hours>40</Default_Weekly_Hours>
          <Snapshot>
        </FTE_Snapshot>
       </Event>
    </EventDetails>
</ChangeEvent>

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Если я правильно понимаю, вы пытаетесь найти данные из Job_History_group, когда вы находитесь в контексте Worker_Events_Completed_group. Лучше всего это сделать с помощью клавиши .

Рассмотрим следующий упрощенный пример:

XML

<Report_Entry>
    <Employee_ID>50067</Employee_ID>
    <Worker>John Grisolano</Worker>
    <Worker_Events_Completed_group>
        <EffectiveDate>2019-01-01</EffectiveDate>
        <Local>abc</Local>
    </Worker_Events_Completed_group>
    <Worker_Events_Completed_group>
        <EffectiveDate>2019-04-01</EffectiveDate>
        <Local>def</Local>
    </Worker_Events_Completed_group>
    <Job_History_group>
        <Effective_Date>2019-01-01</Effective_Date>
        <Remote>January</Remote>
    </Job_History_group>
    <Job_History_group>
        <Effective_Date>2019-04-01</Effective_Date>
        <Remote>April</Remote>
    </Job_History_group>
</Report_Entry>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="job-history" match="Job_History_group" use="Effective_Date" />

<xsl:template match="/Report_Entry">
    <ChangeEvent>
        <EmpID>
            <xsl:value-of select="Employee_ID"/>
        </EmpID>
        <EventDetails>
            <xsl:for-each select="Worker_Events_Completed_group">
                <Event>
                    <ChangeEventDate>
                        <xsl:value-of select="EffectiveDate"/>
                    </ChangeEventDate>
                    <local>
                        <xsl:value-of select="Local"/>
                    </local>
                   <remote>
                        <xsl:value-of select="key('job-history', EffectiveDate)/Remote"/>
                    </remote>
                </Event>
            </xsl:for-each> 
        </EventDetails>
    </ChangeEvent>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<ChangeEvent>
  <EmpID>50067</EmpID>
  <EventDetails>
    <Event>
      <ChangeEventDate>2019-01-01</ChangeEventDate>
      <local>abc</local>
      <remote>January</remote>
    </Event>
    <Event>
      <ChangeEventDate>2019-04-01</ChangeEventDate>
      <local>def</local>
      <remote>April</remote>
    </Event>
  </EventDetails>
</ChangeEvent>
0 голосов
/ 02 мая 2019

Я думаю, что ты почти у цели!Я переместил Current_Date в каждый Worker_Events_Completed_group, добавил ../, чтобы выбрать узел-брат, а затем отфильтровал Job_History_group на основе соответствия, на которое вы намекаете в вашем условном выражении:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output indent="yes" />
    <xsl:template match="/">
        <ChangeEvent>
            <EmpID><xsl:value-of select="Report_Entry/Employee_ID"/></EmpID>           
            <EventDetails>
              <xsl:for-each select="Report_Entry/Worker_Events_Completed_group">
                  <xsl:variable name="Current_Date" select="EffectiveDate"/>
                  <Event>
                      <ChangeEventDate><xsl:value-of select="EffectiveDate"/></ChangeEventDate>
                      <ChangeEntryDate><xsl:value-of select="DateTimeCompleted"/></ChangeEntryDate>
                      <ChangeType><xsl:value-of select="CF_Census_Change_Type"/></ChangeType> 
                      <FTE_Snapshot>  
                          <xsl:for-each select="../Job_History_group[Effective_Date=$Current_Date]">
                              <Snapshot>
                                  <xsl:variable name="swh" select="Scheduled_Weekly_Hours"/>
                                  <xsl:variable name="dwh" select="Default_Weekly_Hours"/>
                                  <Snapshot_EffectiveDate><xsl:value-of select="Effective_Date"/></Snapshot_EffectiveDate>
                                  <Snapshot_FTE><xsl:value-of select="$swh div $dwh * 100"/></Snapshot_FTE>
                              </Snapshot>
                          </xsl:for-each>
                      </FTE_Snapshot>
                  </Event>
                  </xsl:for-each>                   
            </EventDetails>
        </ChangeEvent>
    </xsl:template>
</xsl:stylesheet>
...