date - 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 组合如何,都会拉出最新的交易日期。
我在日期的最大功能时出错
请并感谢您的帮助!
解决方案
这很难理解。
假设您的输入实际上看起来像这样:
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>
推荐阅读
- gdal - Geoserver 2.19 ImagePyramid 处理错误
- android - 从图库中选择图像时活动崩溃(仅限 Google 登录)
- neo4j - 在 Neo4J 中切换关系
- php - OpenTBS复制幻灯片并创建一个新的pptx文件
- python - 从数值变量特征工程二进制变量
- javascript - 从 API Rest 获取图像并用 Javascript 打印
- javascript - 锻造中的 SubtleCrypto.digest() 等价物?
- pandas - 熊猫 get_group 不包括组
- python - Flask 内置服务器 vs gunicorn
- c# - 运动脚本不起作用(统一,C#)