Reputation: 45
For any occurance of negative value in the foll tag i want to replace it with 0.00
Input: <TaxAmount>-1.00</TaxAmount>
Output: <TaxAmount>0.00</TaxAmount>
Code snippet
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/TaxDetails/TaxDetail/TaxAmount">
<TaxAmount>
<xsl:value-of select="translate(., '\-0123456789','0.00')"/>
</TaxAmount>
</xsl:template>
Update:
XSLT used:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TaxAmount[. < '0']">
<TaxAmount>0.00</TaxAmount>
</xsl:template>
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/TaxDetails/TaxDetail/TaxAmount[number(.) < 0]">
<TaxAmount>0.00</TaxAmount>
</xsl:template>
<xsl:template match="/tXML/Message/Order/OrderLines/OrderLine/TaxDetails/TaxDetail/TaxAmount">
<TaxAmount>
<xsl:choose>
<xsl:when test="number(.) < 0">0.00</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</TaxAmount>
</xsl:template>
</xsl:stylesheet>
Input XML:
<tXML>
<Header>
<Source>X</Source>
<Action_Type>Update</Action_Type>
<Reference_ID>9999999</Reference_ID>
<Message_Type>CustomerOrder</Message_Type>
<Company_ID>1</Company_ID>
</Header>
<Message>
<Order>
<OrderNumber>9999999</OrderNumber>
<OrderCaptureDate>06/26/2015 14:59</OrderCaptureDate>
<ExternalOrderNumber>9999999</ExternalOrderNumber>
<OrderType>YYYY</OrderType>
<OrderCurrency>X</OrderCurrency>
<EntryType>NONE</EntryType>
<Confirmed>TRUE</Confirmed>
<PaymentDetails>
<PaymentDetail>
<ExternalPaymentDetailId>X</ExternalPaymentDetailId>
<PaymentMethod>X</PaymentMethod>
<ReqAuthorizationAmount>41.65</ReqAuthorizationAmount>
<AccountNumber>1111111111</AccountNumber>
<ChargeSequence>1</ChargeSequence>
<BillToDetail>
<BillToFirstName>XX</BillToFirstName>
<BillToLastName>XX</BillToLastName>
<BillToAddressLine1>XX</BillToAddressLine1>
<BillToAddressLine2/>
<BillToCity>XX</BillToCity>
<BillToState>x</BillToState>
<BillToPostalCode>x</BillToPostalCode>
<BillToCountry>x</BillToCountry>
<BillToPhone>x</BillToPhone>
<BillToEmail>X</BillToEmail>
</BillToDetail>
</PaymentDetail>
</PaymentDetails>
<ReferenceFields>
<ReferenceField1>x</ReferenceField1>
<ReferenceField10>x</ReferenceField10>
<ReferenceField2/>
<ReferenceField3>4</ReferenceField3>
<ReferenceField4/>
<ReferenceField8>STND</ReferenceField8>
</ReferenceFields>
<OrderLines>
<OrderLine>
<LineNumber>1</LineNumber>
<ExternalLineID>x</ExternalLineID>
<ItemID>x</ItemID>
<Canceled>x</Canceled>
<AllocationInfo>
<RequiredCapacityPerUnit>1</RequiredCapacityPerUnit>
</AllocationInfo>
<PriceInfo>
<Price>41.65</Price>
</PriceInfo>
<Quantity>
<OrderedQty>1</OrderedQty>
<OrderedQtyUOM>ea</OrderedQtyUOM>
<CancelledQty>0</CancelledQty>
</Quantity>
<ShippingInfo>
<RequestedDeliveryBy>11/20/2015 23:59</RequestedDeliveryBy>
<ShipVia>X</ShipVia>
<ShippingAddress>
</ShippingAddress>
</ShippingInfo>
<ChargeDetails>
<ChargeDetail>
</ChargeDetail>
</ChargeDetails>
<TaxDetails>
<TaxDetail>
<TaxAmount>-0.07</TaxAmount>
</TaxDetail>
<TaxDetail>
<TaxAmount>0.01</TaxAmount>
<TaxDTTM>06/26/2015 14:59</TaxDTTM>
</TaxDetail>
</TaxDetails>
</OrderLine>
</OrderLines>
</Order>
</Message>
</tXML>
Appreciate your help. Thanks in advance!!
Upvotes: 1
Views: 329
Reputation: 243489
This shorter transformation:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TaxAmount/text()[0 > .]">0.00</xsl:template>
</xsl:stylesheet>
When applied on the provided XML document:
<tXML>
<Header>
<Source>X</Source>
<Action_Type>Update</Action_Type>
<Reference_ID>9999999</Reference_ID>
<Message_Type>CustomerOrder</Message_Type>
<Company_ID>1</Company_ID>
</Header>
<Message>
<Order>
<OrderNumber>9999999</OrderNumber>
<OrderCaptureDate>06/26/2015 14:59</OrderCaptureDate>
<ExternalOrderNumber>9999999</ExternalOrderNumber>
<OrderType>YYYY</OrderType>
<OrderCurrency>X</OrderCurrency>
<EntryType>NONE</EntryType>
<Confirmed>TRUE</Confirmed>
<PaymentDetails>
<PaymentDetail>
<ExternalPaymentDetailId>X</ExternalPaymentDetailId>
<PaymentMethod>X</PaymentMethod>
<ReqAuthorizationAmount>41.65</ReqAuthorizationAmount>
<AccountNumber>1111111111</AccountNumber>
<ChargeSequence>1</ChargeSequence>
<BillToDetail>
<BillToFirstName>XX</BillToFirstName>
<BillToLastName>XX</BillToLastName>
<BillToAddressLine1>XX</BillToAddressLine1>
<BillToAddressLine2/>
<BillToCity>XX</BillToCity>
<BillToState>x</BillToState>
<BillToPostalCode>x</BillToPostalCode>
<BillToCountry>x</BillToCountry>
<BillToPhone>x</BillToPhone>
<BillToEmail>X</BillToEmail>
</BillToDetail>
</PaymentDetail>
</PaymentDetails>
<ReferenceFields>
<ReferenceField1>x</ReferenceField1>
<ReferenceField10>x</ReferenceField10>
<ReferenceField2/>
<ReferenceField3>4</ReferenceField3>
<ReferenceField4/>
<ReferenceField8>STND</ReferenceField8>
</ReferenceFields>
<OrderLines>
<OrderLine>
<LineNumber>1</LineNumber>
<ExternalLineID>x</ExternalLineID>
<ItemID>x</ItemID>
<Canceled>x</Canceled>
<AllocationInfo>
<RequiredCapacityPerUnit>1</RequiredCapacityPerUnit>
</AllocationInfo>
<PriceInfo>
<Price>41.65</Price>
</PriceInfo>
<Quantity>
<OrderedQty>1</OrderedQty>
<OrderedQtyUOM>ea</OrderedQtyUOM>
<CancelledQty>0</CancelledQty>
</Quantity>
<ShippingInfo>
<RequestedDeliveryBy>11/20/2015 23:59</RequestedDeliveryBy>
<ShipVia>X</ShipVia>
<ShippingAddress>
</ShippingAddress>
</ShippingInfo>
<ChargeDetails>
<ChargeDetail>
</ChargeDetail>
</ChargeDetails>
<TaxDetails>
<TaxDetail>
<TaxAmount>-0.07</TaxAmount>
</TaxDetail>
<TaxDetail>
<TaxAmount>0.01</TaxAmount>
<TaxDTTM>06/26/2015 14:59</TaxDTTM>
</TaxDetail>
</TaxDetails>
</OrderLine>
</OrderLines>
</Order>
</Message>
</tXML>
Produces the wanted, correct result:
<tXML>
<Header>
<Source>X</Source>
<Action_Type>Update</Action_Type>
<Reference_ID>9999999</Reference_ID>
<Message_Type>CustomerOrder</Message_Type>
<Company_ID>1</Company_ID>
</Header>
<Message>
<Order>
<OrderNumber>9999999</OrderNumber>
<OrderCaptureDate>06/26/2015 14:59</OrderCaptureDate>
<ExternalOrderNumber>9999999</ExternalOrderNumber>
<OrderType>YYYY</OrderType>
<OrderCurrency>X</OrderCurrency>
<EntryType>NONE</EntryType>
<Confirmed>TRUE</Confirmed>
<PaymentDetails>
<PaymentDetail>
<ExternalPaymentDetailId>X</ExternalPaymentDetailId>
<PaymentMethod>X</PaymentMethod>
<ReqAuthorizationAmount>41.65</ReqAuthorizationAmount>
<AccountNumber>1111111111</AccountNumber>
<ChargeSequence>1</ChargeSequence>
<BillToDetail>
<BillToFirstName>XX</BillToFirstName>
<BillToLastName>XX</BillToLastName>
<BillToAddressLine1>XX</BillToAddressLine1>
<BillToAddressLine2/>
<BillToCity>XX</BillToCity>
<BillToState>x</BillToState>
<BillToPostalCode>x</BillToPostalCode>
<BillToCountry>x</BillToCountry>
<BillToPhone>x</BillToPhone>
<BillToEmail>X</BillToEmail>
</BillToDetail>
</PaymentDetail>
</PaymentDetails>
<ReferenceFields>
<ReferenceField1>x</ReferenceField1>
<ReferenceField10>x</ReferenceField10>
<ReferenceField2/>
<ReferenceField3>4</ReferenceField3>
<ReferenceField4/>
<ReferenceField8>STND</ReferenceField8>
</ReferenceFields>
<OrderLines>
<OrderLine>
<LineNumber>1</LineNumber>
<ExternalLineID>x</ExternalLineID>
<ItemID>x</ItemID>
<Canceled>x</Canceled>
<AllocationInfo>
<RequiredCapacityPerUnit>1</RequiredCapacityPerUnit>
</AllocationInfo>
<PriceInfo>
<Price>41.65</Price>
</PriceInfo>
<Quantity>
<OrderedQty>1</OrderedQty>
<OrderedQtyUOM>ea</OrderedQtyUOM>
<CancelledQty>0</CancelledQty>
</Quantity>
<ShippingInfo>
<RequestedDeliveryBy>11/20/2015 23:59</RequestedDeliveryBy>
<ShipVia>X</ShipVia>
<ShippingAddress>
</ShippingAddress>
</ShippingInfo>
<ChargeDetails>
<ChargeDetail>
</ChargeDetail>
</ChargeDetails>
<TaxDetails>
<TaxDetail>
<TaxAmount>0.00</TaxAmount>
</TaxDetail>
<TaxDetail>
<TaxAmount>0.01</TaxAmount>
<TaxDTTM>06/26/2015 14:59</TaxDTTM>
</TaxDetail>
</TaxDetails>
</OrderLine>
</OrderLines>
</Order>
</Message>
</tXML>
Explanation:
This solution uses the most general and powerful XSLT design pattern of overriding the identity rule.
The overriding template matches any text node that is a child of a TaxAmount
element, and whose string value (of the text node), when converted to number, is less than 0
. It simply replaces the matched node by a new one, whose string value is the string 0.00
.
Upvotes: 0
Reputation: 117043
Assuming you also have the identity transform template in place, you could use:
<xsl:template match="TaxAmount[. < 0]">
<TaxAmount>0.00</TaxAmount>
</xsl:template>
The following stylesheet:
XSLT 1.0
<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:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TaxAmount[. < 0]">
<TaxAmount>0.00</TaxAmount>
</xsl:template>
</xsl:stylesheet>
when applied to your example input, will return:
Result
<?xml version="1.0" encoding="UTF-8"?>
<tXML>
<Header>
<Source>X</Source>
<Action_Type>Update</Action_Type>
<Reference_ID>9999999</Reference_ID>
<Message_Type>CustomerOrder</Message_Type>
<Company_ID>1</Company_ID>
</Header>
<Message>
<Order>
<OrderNumber>9999999</OrderNumber>
<OrderCaptureDate>06/26/2015 14:59</OrderCaptureDate>
<ExternalOrderNumber>9999999</ExternalOrderNumber>
<OrderType>YYYY</OrderType>
<OrderCurrency>X</OrderCurrency>
<EntryType>NONE</EntryType>
<Confirmed>TRUE</Confirmed>
<PaymentDetails>
<PaymentDetail>
<ExternalPaymentDetailId>X</ExternalPaymentDetailId>
<PaymentMethod>X</PaymentMethod>
<ReqAuthorizationAmount>41.65</ReqAuthorizationAmount>
<AccountNumber>1111111111</AccountNumber>
<ChargeSequence>1</ChargeSequence>
<BillToDetail>
<BillToFirstName>XX</BillToFirstName>
<BillToLastName>XX</BillToLastName>
<BillToAddressLine1>XX</BillToAddressLine1>
<BillToAddressLine2/>
<BillToCity>XX</BillToCity>
<BillToState>x</BillToState>
<BillToPostalCode>x</BillToPostalCode>
<BillToCountry>x</BillToCountry>
<BillToPhone>x</BillToPhone>
<BillToEmail>X</BillToEmail>
</BillToDetail>
</PaymentDetail>
</PaymentDetails>
<ReferenceFields>
<ReferenceField1>x</ReferenceField1>
<ReferenceField10>x</ReferenceField10>
<ReferenceField2/>
<ReferenceField3>4</ReferenceField3>
<ReferenceField4/>
<ReferenceField8>STND</ReferenceField8>
</ReferenceFields>
<OrderLines>
<OrderLine>
<LineNumber>1</LineNumber>
<ExternalLineID>x</ExternalLineID>
<ItemID>x</ItemID>
<Canceled>x</Canceled>
<AllocationInfo>
<RequiredCapacityPerUnit>1</RequiredCapacityPerUnit>
</AllocationInfo>
<PriceInfo>
<Price>41.65</Price>
</PriceInfo>
<Quantity>
<OrderedQty>1</OrderedQty>
<OrderedQtyUOM>ea</OrderedQtyUOM>
<CancelledQty>0</CancelledQty>
</Quantity>
<ShippingInfo>
<RequestedDeliveryBy>11/20/2015 23:59</RequestedDeliveryBy>
<ShipVia>X</ShipVia>
<ShippingAddress/>
</ShippingInfo>
<ChargeDetails>
<ChargeDetail/>
</ChargeDetails>
<TaxDetails>
<TaxDetail>
<TaxAmount>0.00</TaxAmount>
</TaxDetail>
<TaxDetail>
<TaxAmount>0.01</TaxAmount>
<TaxDTTM>06/26/2015 14:59</TaxDTTM>
</TaxDetail>
</TaxDetails>
</OrderLine>
</OrderLines>
</Order>
</Message>
</tXML>
Upvotes: 1