首页 > 解决方案 > XSLT - 如何根据 2 个兄弟姐妹的属性选择最新的格式化日期

问题描述

最近为我提供了一个 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 则 05/23/2019(这将是此组合的最晚日期) 如果没有 Submit/Re-Submit(换句话说,ActionType = Submit & Status = Submitted)然后是 2019 年 5 月 17 日

实际结果是,当我不输入 max 函数时,无论 ActionType Status 组合如何,都会拉出最新的交易日期。

我在日期的最大功能时出错

请并感谢您的帮助!

标签: datexsltmaxconditional-statementssiblings

解决方案


这很难理解。

假设您的输入实际上看起来像这样:

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 St​​atus = '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 St​​atus = '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>

推荐阅读