Как бороться с несколькими десятичными числами при разборе XML с XSLT? - PullRequest
1 голос
/ 16 апреля 2019

Я работаю в сфере розничной торговли, где у нас есть MaxLineStatus , что указывает на текущий статус заказа, размещенного клиентом.В рамках этого процесса у меня есть XML, который необходимо передать в XSLT для преобразования.Мой XSLT имеет проверку MaxLineStatus <3700.7777, и значение MaxLineStatus передается как 3200.200.100 во входной XML.В идеальном сценарии <strong>3200.200.100 меньше, чем 3700.7777 , и, в свою очередь, оно должно соответствовать критериям и заполнять узел OrderLine.

Всякий раз, когда я прохожу 3200.200 на месте3200.200.100 в XML, я получаю желаемый результат.Я даже пытался сохранить значение xslt в некоторой переменной, а затем сравнить его, но все равно оно не работает.

Я сравниваю значение в следующем фрагменте кода:

<xsl:attribute name="OrderLineCount"><xsl:value-of select="count(./OrderLine[(@MaxLineStatus &lt; 3700.7777) and (@MaxLineStatus!='3200.150') and (@MaxLineStatus!='1400')])" /></xsl:attribute>

Спасибо за помощь и извините за публикацию xml и xslt таким образом.Я столкнулся с некоторой проблемой, отступающей от того же самого.Пожалуйста, извините.

XML:

<OrderRelease APIName="sendReleaseModificationUpdateToILS" CarrierServiceCode="" DeliveryMethod="DEL" DocumentType="0003" EnterpriseCode="RETAIL" MFLocationId="70" NotificationType=" " OrderDate="20190410T06:49:07" OrderHeaderKey="2019041006490764562203" OrderLineCount="1" PriorityCode="" PriorityNumber="0" ProNumber="" ReleaseNo="1" RewardZoneIndicator="N" SCAC="" SalesOrderNo="1119100622586" ShipNode="BBY_9034" ShippingType="" WorkOrderKey="2019041006493464562225"><Shipnode Localecode="en_US_CST" NodeType="DDC" ReceiptProcessingTime="60.00" ShipNode="BBY_9034"><Extn FulfilmentDateBufferTime="0" LocationID="9034" MFLocationId="70" MobileSAS="N" /></Shipnode><Order CarrierServiceCode="" CustomerEMailID="RACHAKONDA.SATYASRINIVAS@BESTBUY.COM" DocumentType="0001" DraftOrderFlag="N" EnterpriseCode="RETAIL" MaxOrderStatus="3200.200.100" MinOrderStatus="1100.100" NotificationType=" " OrderDate="20190410T06:49:07" OrderHeaderKey="2019041006490764562203" OrderNo="1119100622586" OrderPurpose="" PriorityCode="" PriorityNumber="0" ReturnOrderHeaderKeyForExchange=" " SCAC="" SellerOrganizationCode="BBY_281" ShipNode=" " Status="Partially Awaiting Pickup Date" isHistory="N" /><OrderLine CarrierServiceCode="" ConditionVariable1="" ConditionVariable2="" DeliveryMethod="DEL" DependentOnLineKey=" " DerivedFromOrderHeaderKey="2018012921180556404483" DerivedFromOrderLineKey="2018012921180556404485" FulfillmentType="DELIVERY" HasDerivedChild="" LineType="RETURN" MaxLineStatus="3200.200.100" MaxLineStatusDesc="Awaiting Pickup Date" MinLineStatus="3200.200.100" MinLineStatusDesc="Awaiting Pickup Date" OpenQty="1" OrderLineKey="2019041006490764562204" OrderedQty="1" PrimeLineNo="1" ProcureFromNode="" PromisedApptEndDate="20190413T19:00:00" PromisedApptStartDate="20190413T07:00:00" SCAC="" ShipNode="BBY_9034" ShipToKey=" " Status="Awaiting Pickup Date" SubLineNo="1"><Extn ExpectedShipDate="20190410T00:00:00" StreetDate="19000101T00:00:00"><EOMSOrderLineList><EOMSOrderLine ExpectedApptEndDate="20190413T19:00:00" ExpectedApptStartDate="20190413T07:00:00" HingeSettings="" LineShipNodeWMS="WMS" OrderLineKey="2019041006490764562204" SellingStoreId="281" /></EOMSOrderLineList></Extn><Item CustomerItem="3519796" CustomerItemDesc="NINTENDO DS UNIVERSAL GAME SELECTOR CASE" ItemID="1640461" ManufacturerItem="52LB5D" ProductClass="" ProductLine="9.99.224" UnitOfMeasure="EACH" /><Notes NumberOfNotes="0" /><ParentOrderLineRelationships /></OrderLine></OrderRelease>

XSLT:

<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:template match="/OrderRelease"><xsl:copy><xsl:copy-of select="@*" /><xsl:attribute name="MFLocationId"><xsl:value-of select="./Shipnode/Extn/@MFLocationId" /></xsl:attribute><Extn><xsl:attribute name="ReleaseSeqNo"><xsl:value-of select="./Extn/@ReleaseSeqNo" /></xsl:attribute></Extn><xsl:attribute name="OrderLineCount"><xsl:value-of select="count(./OrderLine[(@MaxLineStatus &lt; 3700.7777) and (@MaxLineStatus!='3200.150') and (@MaxLineStatus!='1400')])" /></xsl:attribute><xsl:for-each select="./OrderLine[(@MaxLineStatus &lt; 3700.7777) and (@MaxLineStatus!='3200.150') and (@MaxLineStatus!='1400')]"><OrderLine><xsl:copy-of select="./@*" /><xsl:copy-of select="./OrderLineInvAttRequest" /><Item><xsl:copy-of select="./Item/@*" /><Extn><xsl:attribute name="BrandItemID"><xsl:value-of select="./Item/@CustomerItem" /></xsl:attribute></Extn></Item><Notes><xsl:copy-of select="./Notes/*" /></Notes><ParentOrderLineRelationships><xsl:copy-of select="./ParentOrderLineRelationships/*" /></ParentOrderLineRelationships><Extn><xsl:copy-of select="./Extn/*" /></Extn></OrderLine></xsl:for-each><Notes><xsl:for-each select="./Notes/Note"><xsl:copy-of select="current()" /></xsl:for-each></Notes><Order><xsl:attribute name="OrderPurpose"><xsl:value-of select="./Order/@OrderPurpose" /></xsl:attribute><xsl:attribute name="ReturnOrderHeaderKeyForExchange"><xsl:value-of select="./Order/@ReturnOrderHeaderKeyForExchange" /></xsl:attribute><xsl:attribute name="CustomerEMailID"><xsl:value-of select="./Order/@CustomerEMailID" /></xsl:attribute><xsl:attribute name="SellerOrganizationCode"><xsl:value-of select="./Order/@SellerOrganizationCode" /></xsl:attribute><Extn><xsl:attribute name="BillingPhoneNo"><xsl:value-of select="./Order/Extn/@BillingPhoneNo" /></xsl:attribute></Extn></Order><xsl:copy-of select="./PersonInfoShipTo" /></xsl:copy></xsl:template>

Фактический результат:

<OrderRelease APIName="sendReleaseModificationUpdateToILS" CarrierServiceCode="" DeliveryMethod="DEL" DocumentType="0003" EnterpriseCode="RETAIL" MFLocationId="70" NotificationType=" " OrderDate="20190410T06:49:07" OrderHeaderKey="2019041006490764562203" OrderLineCount="1" PriorityCode="" PriorityNumber="0" ProNumber="" ReleaseNo="1" RewardZoneIndicator="N" SCAC="" SalesOrderNo="1119100622586" ShipNode="BBY_9034" ShippingType="" WorkOrderKey="2019041006493464562225"><Extn ReleaseSeqNo="" /><Notes></Notes><Order OrderPurpose="" ReturnOrderHeaderKeyForExchange=" " CustomerEMailID="RACHAKONDA.SATYASRINIVAS@BESTBUY.COM" SellerOrganizationCode="BBY_281"><Extn BillingPhoneNo="" /></Order></OrderRelease>

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

<OrderRelease APIName="sendReleaseModificationUpdateToILS" CarrierServiceCode="" DeliveryMethod="DEL" DocumentType="0003" EnterpriseCode="RETAIL" MFLocationId="70" NotificationType=" " OrderDate="20190410T06:49:07" OrderHeaderKey="2019041006490764562203" OrderLineCount="1" PriorityCode="" PriorityNumber="0" ProNumber="" ReleaseNo="1" RewardZoneIndicator="N" SCAC="" SalesOrderNo="1119100622586" ShipNode="BBY_9034" ShippingType="" WorkOrderKey="2019041006493464562225"><Extn ReleaseSeqNo="" /><OrderLine CarrierServiceCode="" ConditionVariable1="" ConditionVariable2="" DeliveryMethod="DEL" DependentOnLineKey=" " DerivedFromOrderHeaderKey="2018012921180556404483" DerivedFromOrderLineKey="2018012921180556404485" FulfillmentType="DELIVERY" HasDerivedChild="" LineType="RETURN" MaxLineStatus="3200.200.100" MaxLineStatusDesc="Awaiting Pickup Date" MinLineStatus="3200.200.100" MinLineStatusDesc="Awaiting Pickup Date" OpenQty="1" OrderLineKey="2019041006490764562204" OrderedQty="1" PrimeLineNo="1" ProcureFromNode="" PromisedApptEndDate="20190413T19:00:00" PromisedApptStartDate="20190413T07:00:00" SCAC="" ShipNode="BBY_9034" ShipToKey=" " Status="Awaiting Pickup Date" SubLineNo="1"><Item CustomerItem="3519796" CustomerItemDesc="NINTENDO DS UNIVERSAL GAME SELECTOR CASE" ItemID="1640461" ManufacturerItem="52LB5D" ProductClass="" ProductLine="9.99.224" UnitOfMeasure="EACH"><Extn BrandItemID="3519796" /></Item><Notes></Notes><ParentOrderLineRelationships></ParentOrderLineRelationships><Extn><EOMSOrderLineList><EOMSOrderLine ExpectedApptEndDate="20190413T19:00:00" ExpectedApptStartDate="20190413T07:00:00" HingeSettings="" LineShipNodeWMS="WMS" OrderLineKey="2019041006490764562204" SellingStoreId="281" /></EOMSOrderLineList></Extn></OrderLine><Notes></Notes><Order OrderPurpose="" ReturnOrderHeaderKeyForExchange=" " CustomerEMailID="RACHAKONDA.SATYASRINIVAS@BESTBUY.COM" SellerOrganizationCode="BBY_281"><Extn BillingPhoneNo="" /></Order></OrderRelease>

1 Ответ

1 голос
/ 16 апреля 2019

В XSLT 1.0 единственным способом сравнения строк для отношений < и > является сортировка;операторы < и > всегда преобразуются в числа (и если значение не может быть преобразовано в число, оно рассматривается как NaN).

В идеале, перейдите к более новой версии XSLT.(1.0 становится ОЧЕНЬ старым).

Если вы не можете этого сделать, то это будет запутанный обходной путь.Три возможных подхода:

(а) найти способ преобразования этих «десятичных точек» значений в числа, которые сортируются правильно.(например, добавьте каждый компонент к стандартному количеству цифр, затем удалите точки).

(b) отсортируйте значения, выделите порядковые номера и проверьте, удовлетворяет ли значение соответствующему условию, просмотрев порядковые номера.

(c) вызвать сравнение с функцией расширения на внешнем языке, например Java, для сравнения.

...