XSLT - Как выбрать последнюю отформатированную дату при условии атрибутов 2 братьев и сестер - PullRequest
0 голосов
/ 11 июня 2019

Недавно мне был предоставлен файл xslt для обновления, и я никогда раньше не использовал xslt.Я пытаюсь выбрать последнюю дату транзакции на основе конкретных атрибутов двух братьев и сестер (ActionType и Status).Как выбрать условие на основе двух братьев и сестер и вернуть дату из этого раздела?

Я обновил свой код с помощью предоставленного кода, но он не работает:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:ms="urn:schemas-microsoft-com:xslt">
<xsl:output method="text" encoding="utf-8" />
<xsl:template match="/"><xsl:for-each select="SupplierConnectInvoice/Invoice | SupplierConnectInvoice/ImageInvoice">
Level1,,<xsl:if test="InvoiceHeader/InvoiceType = 'Original Invoice'">VO</xsl:if><xsl:if test="InvoiceHeader/InvoiceType = 'Credit Invoice'">AD</xsl:if>,<xsl:value-of select="InvoiceHeader/Partner[@PartnerType='Supplier']/Company/CompanyCode" />,<xsl:value-of select="ms:format-date(InvoiceHeader/InvoiceDate, 'MM/dd/yyy')" />,<xsl:value-of select="InvoiceHeader/InvoiceNumber" />,

    <xsl:variable name="resubmitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Re-Submitted']" as="xs:dateTime*"/>
    <xsl:variable name="submitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Submitted']" as="xs:dateTime*"/>

    <xsl:choose>
        <xsl:when test="count($resubmitted)">
            <xsl:value-of select="format-dateTime(max($resubmitted),'[M01]/[D01]/[Y0001]')"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="format-dateTime(max($submitted),'[M01]/[D01]/[Y0001]')"/>             
        </xsl:otherwise>
    </xsl:choose>

Source Code

    <?xml version="1.0" encoding="UTF-8"?>
    -<SupplierConnectInvoice xmlns=" " type="A">      
        -<ImageInvoice id="150351390">       
           -<InvoiceHeader>    
                 <InvoiceNumber>494022</InvoiceNumber>        
                 +<Partner PartnerType="Supplier">
                 +<Partner PartnerType="Buyer">
                 <InvoiceDate>2018-12-11</InvoiceDate>
                 <InvoiceType>Original Invoice</InvoiceType>
                 <TransportClass>Supplier_Image_Direct</TransportClass>
                 <Total>1483.78</Total>
                 <SubmittedTotal>1483.78</SubmittedTotal>
                 <TotalLineItems>1</TotalLineItems>
                 <LongDescription>TM General Adv</LongDescription>
                 <CurrencyCode>CAD</CurrencyCode>
                 +<DocumentAction>
                 +<DocumentAction>
                 -<DocumentAction>
                     +<Person Role="DocumentActionPerformer">
                     <ActionType>Forward</ActionType>
                     <Status>Re-Submitted</Status>
                     <TransactionDateTime>2019-05-21T12:54:42</TransactionDateTime> 
               -<DocumentAction>
                     +<Person Role="DocumentActionPerformer">
                     <ActionType>Submit</ActionType>  
                     <Status>Re-Submitted</Status>
                     <LongDescription>please see the amended</LongDescription>
                     <TransactionDateTime>2019-05-21T12:00:42</TransactionDateTime>

               -<DocumentAction>
                     +<Person Role="DocumentActionPerformer">
                     <ActionType>Dispute</ActionType>    
                     <Status>Disputed</Status>
                     <LongDescription>please change</LongDescription>
                     <TransactionDateTime>2019-05-21T08:44:46</TransactionDateTime>

               -<DocumentAction>
                     +<Person Role="DocumentActionPerformer">
                     <ActionType>Submit</ActionType>
                     <Status>Submitted</Status>
                     <LongDescription>Uploaded on 05/17/2019 at 03:53:40 PM MDT</LongDescription>
                     <TransactionDateTime>2019-05-17T15:54:43</TransactionDateTime>

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

Если существует ActionType = Submit & Status = Re-Submitted, то 23.05.2009 (это будет самая поздняя дата этой комбинации). Если нет Submit / Re-Submit (другими словами, ActionType = Submit& Статус = Отправлено), затем 05/17/2019

Фактические результаты состоят в том, что дата последней транзакции определяется независимо от комбинации состояния ActionType, когда я не включаю функцию max.

Я выдает ошибку, когда функция max на дату

Пожалуйста и спасибо за вашу помощь!

1 Ответ

0 голосов
/ 11 июня 2019

Это трудно понять.

Предполагая, что ваш ввод действительно выглядит примерно так:

XML

<DocumentAction>
       <ActionType>Forward</ActionType>
       <Status>Re-Submitted</Status>
       <TransactionDateTime>2019-05-25T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Re-Submitted</Status>
       <TransactionDateTime>2019-05-23T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Re-Submitted</Status>
       <TransactionDateTime>2019-05-21T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Submitted</Status>
       <TransactionDateTime>2019-05-19T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Submitted</Status>
       <TransactionDateTime>2019-05-17T12:00:42</TransactionDateTime>
</DocumentAction>

вы можете использоватьследующая таблица стилей:

XSLT 2.0

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

<xsl:template match="/DocumentAction">
    <xsl:variable name="resubmitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Re-Submitted']" as="xs:dateTime*"/>
    <xsl:variable name="submitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Submitted']" as="xs:dateTime*"/>
    <output>
        <xsl:choose>
            <xsl:when test="count($resubmitted)">
                <xsl:value-of select="format-dateTime(max($resubmitted),'[M01]/[D01]/[Y0001]')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="format-dateTime(max($submitted),'[M01]/[D01]/[Y0001]')"/>             
            </xsl:otherwise>
        </xsl:choose>
    </output>
</xsl:template>

</xsl:stylesheet>

для возврата:

Результат

<?xml version="1.0" encoding="UTF-8"?>
<output>05/23/2019</output>

это последняя дата, для которой ActionType = 'Submit' AND Status = 'Re-Submitted'.

Демо : https://xsltfiddle.liberty -development.net / 3NJ38ZJ


Если вы удалите эти действия, так что ввод будет:

XML

<DocumentAction>
       <ActionType>Forward</ActionType>
       <Status>Re-Submitted</Status>
       <TransactionDateTime>2019-05-25T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Submitted</Status>
       <TransactionDateTime>2019-05-19T12:00:42</TransactionDateTime>

       <ActionType>Submit</ActionType>
       <Status>Submitted</Status>
       <TransactionDateTime>2019-05-17T12:00:42</TransactionDateTime>
</DocumentAction>

результат будет:

Результат

<?xml version="1.0" encoding="UTF-8"?>
<output>05/19/2019</output>

, которыйсамая последняя дата, для которой ActionType = 'Submit' AND Status = 'Submitted'.

Демо : https://xsltfiddle.liberty -development.net / 3NJ38ZJ / 1


Добавлено:

Ещеэлегантная версия той же идеи:

XSLT 2.0

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

<xsl:template match="/DocumentAction">
    <xsl:variable name="resubmitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Re-Submitted']" as="xs:dateTime*"/>
    <xsl:variable name="submitted" select="TransactionDateTime[preceding-sibling::ActionType[1]='Submit' and preceding-sibling::Status[1]='Submitted']" as="xs:dateTime*"/>
    <xsl:variable name="latest-dateTime" select="if (count($resubmitted)) then max($resubmitted) else max($submitted)"/>
    <output>
        <xsl:value-of select="format-dateTime($latest-dateTime,'[M01]/[D01]/[Y0001]')"/>                
    </output>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...