Date XSLT-如何在具有两个同级属性的情况下选择最新的格式化日期

Date XSLT-如何在具有两个同级属性的情况下选择最新的格式化日期,date,xslt,max,conditional-statements,siblings,Date,Xslt,Max,Conditional Statements,Siblings,我最近收到了一个要更新的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">

我最近收到了一个要更新的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>

一级,VOAD,VOAD,,,,
源代码
-      
-       
-    
494022
+
+
2018-12-11
原始发票
供应商\形象\直接
1483.78
1483.78
1.
普通高级
计算机辅助设计
+
+
-
+
向前地
重新提交
2019-05-21T12:54:42
-
+
提交
重新提交
请参阅经修订的
2019-05-21T12:00:42
-
+
争端
争论
请换
2019-05-21T08:44:46
-
+
提交
提交
于2019年5月17日下午3:53:40 MDT上传
2019-05-17T15:54:43
预期成果:

如果存在ActionType=Submit&Status=Re Submited,则为2019年5月23日(这将是此组合的最新日期) 如果没有提交/重新提交(换句话说,ActionType=Submit&Status=Submited),则为2019年5月17日

实际结果是,当我没有输入max函数时,不管ActionType状态组合如何,都会拉取最新的事务日期

当日期上的max函数


谢谢你的帮助

这很难理解

假设您的输入实际上如下所示:

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>
<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

<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>
<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>


补充: 同样想法的更优雅版本:

XSLT2.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>
<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>


我最初的帖子似乎无法挽救我对这个问题的尝试,但事实是:我没有遵循你描述的逻辑。另外,还不清楚您是否使用XSLT2.0处理器。我使用的是XSLT2.0。我去更新了我的xml源代码。对不起!正如您所看到的,在我的代码中有多个DocumentAction。我想循环查找是否存在ActionType='Submit'和Status='Re Submitted'。如果有,返回提交/重新提交值组合的最新日期。如果没有提交/重新提交值组合,请查找ActionType='Submit'和Status='Submited',并检索提交/提交的日期。因此,从本质上讲,如果我运行此命令是为了从xml文档中提取细节,那么检索日期应该是2019年5月24日。有意义吗?你在这里发布的不是XML文档。我尝试使用你的解决方案,但失败了。我没有使用的项目之一是。我正在使用,因为我有其他元素,我需要拉。这就是失败的原因吗?如果是这样,我需要做什么才能让它运行?我不知道。我只能根据我所看到的来回答。甚至上述内容也主要基于对XML外观的猜测。在任何情况下,都只能有一个根元素,因此拥有
不应阻止您处理“需要拉取的其他元素”)(不管这意味着什么)。