简体   繁体   English

使用 XSLT 1.0 复制带有附加逻辑的 XML

[英]Copy the XML with additional logic using XSLT 1.0

I want to copy the whole xml and apply this additional logic: If /OrderMessage/IncomingOrderMessage/IncomingOrder/TransferDetails/TransferDetails_item(just check for the first one)/quantity tag exists then set /OrderMessage/IncomingOrderMessage/IncomingOrder/doNotTransfer to true.我想复制整个 xml 并应用此附加逻辑:如果 /OrderMessage/IncomingOrderMessage/IncomingOrder/TransferDetails/TransferDetails_item(只需检查第一个)/数量标签,则将 /OrderMessage/IncomingOrderMessage/IncomingOrder/doNotTransfer 设置为 true。 Otherwise just copy /OrderMessage/IncomingOrderMessage/IncomingOrder/doNotTransfer as it is.否则,只需照原样复制 /OrderMessage/IncomingOrderMessage/IncomingOrder/doNotTransfer。

Input.xml:输入.xml:

<?xml version="1.0" encoding="UTF-8"?>
<OrderMessage>
   <IncomingOrderMessage>
     <IncomingOrder>
        <totalOrderQuantity>10000</totalOrderQuantity>
        <totalOrderPrice>500000</totalOrderPrice>
        <TransferDetails>       
           <TransferDetails_item>
              <quantity>5000</quantity>
              <price>250000</price>
             <location>India</location>
           </TransferDetails_item>
           <TransferDetails_item>
              <quantity>5000</quantity>
              <price>250000</price>
              <location>US</location>
          </TransferDetails_item>
       </TransferDetails>
      <orderCurrency>USD</orderCurrency>
      <doNotTransfer>false</doNotTransfer>
      <orderPayment>Credit</orderPayment>
   </IncomingOrder>
 </IncomingOrderMessage>
</OrderMessage>

Output.xml Output.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <OrderMessage>
    <IncomingOrderMessage>
       <IncomingOrder>
           <totalOrderQuantity>10000</totalOrderQuantity>
           <totalOrderPrice>500000</totalOrderPrice>
           <TransferDetails>        
                <TransferDetails_item>
                   <quantity>5000</quantity>
                   <price>250000</price>
                   <location>India</location>
                </TransferDetails_item>
                <TransferDetails_item>
                   <quantity>5000</quantity>
                   <price>250000</price>
                   <location>US</location>
                </TransferDetails_item>
          </TransferDetails>
          <orderCurrency>USD</orderCurrency>
          <doNotTransfer>true</doNotTransfer>
          <orderPayment>Credit</orderPayment>
      </IncomingOrder>
   </IncomingOrderMessage>
</OrderMessage>

Could someone please help me on it.有人可以帮我吗。

I am able to get the output with the below xslt:我可以通过以下 xslt 获得 output:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
       <xsl:template match="@*|node()">
         <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
         </xsl:copy>
       </xsl:template>

       <xsl:template match="IncomingOrder">
         <xsl:choose>
           <xsl:when test="//TransferDetails_item[1]/quantity ">
             <xsl:copy>
                 <xsl:apply-templates select="@*|node() except doNotTransfer"/>
                 <doNotTransfer>true</doNotTransfer>
             </xsl:copy>

          </xsl:when>
          <xsl:otherwise>
               <xsl:copy>
                 <xsl:apply-templates select="@*|node()"/>
               </xsl:copy>
          </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

Or shortly:或者很快:

XSLT 1.0 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="doNotTransfer[../TransferDetails/TransferDetails_item/quantity]">
    <xsl:copy>true</xsl:copy>
</xsl:template>

</xsl:stylesheet>

If the value of doNotTransfer is always true or false , you could make the 2nd template:如果doNotTransfer的值始终为truefalse ,您可以制作第二个模板:

<xsl:template match="doNotTransfer">
    <xsl:copy>
        <xsl:value-of select="boolean(../TransferDetails/TransferDetails_item/quantity)" />
    </xsl:copy>
</xsl:template>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM