[英]Apply xslt template on many lines
我有一个XML,其中可以包含许多PurchaseOrderLine部分,以LineNumber区分(10、20、30等)。 在每一行中,我需要在UserArea部分中插入一个带有TaxID最后一个字符的子部分。 我当前的xslt部分起作用,因为它总是从第一行获取最后一个char,并将其放在所有行上。 我无法单独查看每一行。
谢谢。
传入XML:
<?xml version="1.0" encoding="UTF-8"?>
<SyncPurchaseOrder xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:inforpo="http://schema.infor.com/eam/inforbodmodel/100/purchaseorder" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US" releaseID="9.2" systemEnvironmentCode="Production" versionID="2.9.1">
<DataArea>
<PurchaseOrder>
<PurchaseOrderLine>
<LineNumber>10</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
<PurchaseOrderLine>
<LineNumber>20</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000XCCN</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
</PurchaseOrder>
</DataArea>
</SyncPurchaseOrder>
当前的XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://schema.infor.com/InforOAGIS/2" xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="my java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//my:PurchaseOrder/my:PurchaseOrderLine/my:UserArea/my:Property[my:NameValue/@name='eam.CostCode']">
<xsl:copy-of select="."/>
<Property>
<NameValue name="llp.lastCharTaxCode">
<xsl:value-of select="substring(//my:PurchaseOrder/my:PurchaseOrderLine/my:BuyerParty/my:PartyIDs/my:TaxID, string-length(//my:PurchaseOrder/my:PurchaseOrderLine/my:BuyerParty/my:PartyIDs/my:TaxID), 1)" />
</NameValue>
</Property>
</xsl:template>
</xsl:stylesheet>
所需的输出:
<?xml version="1.0" encoding="UTF-8"?>
<SyncPurchaseOrder xmlns="http://schema.infor.com/InforOAGIS/2"
xmlns:inforpo="http://schema.infor.com/eam/inforbodmodel/100/purchaseorder"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
languageCode="en-US"
releaseID="9.2"
systemEnvironmentCode="Production"
versionID="2.9.1">
<DataArea>
<PurchaseOrder>
<PurchaseOrderLine>
<LineNumber>10</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
<Property>
<NameValue name="llp.lastCharTaxCode">0</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
<PurchaseOrderLine>
<LineNumber>20</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000XCCN</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
<Property>
<NameValue name="llp.lastCharTaxCode">N</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
</PurchaseOrder>
</DataArea>
</SyncPurchaseOrder>
可以将模板与<UserArea>
匹配,而不是将模板与<Property>
匹配,如下所示。
<xsl:template match="my:UserArea">
<xsl:copy>
<xsl:copy-of select="my:Property" />
<xsl:variable name="taxID" select="../my:BuyerParty/my:PartyIDs/my:TaxID" />
<Property>
<NameValue name="llp.lastCharTaxCode">
<xsl:value-of select="substring($taxID, string-length($taxID), 1)" />
</NameValue>
</Property>
</xsl:copy>
</xsl:template>
这将提供所需的输出
<SyncPurchaseOrder xmlns="http://schema.infor.com/InforOAGIS/2"
xmlns:inforpo="http://schema.infor.com/eam/inforbodmodel/100/purchaseorder"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" languageCode="en-US"
releaseID="9.2" systemEnvironmentCode="Production" versionID="2.9.1">
<DataArea>
<PurchaseOrder>
<PurchaseOrderLine>
<LineNumber>10</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
<Property>
<NameValue name="llp.lastCharTaxCode">0</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
<PurchaseOrderLine>
<LineNumber>20</LineNumber>
<BuyerParty>
<PartyIDs>
<TaxID>BFPAA000XCCN</TaxID>
</PartyIDs>
</BuyerParty>
<UserArea>
<Property>
<NameValue name="eam.CostCode">a1</NameValue>
</Property>
<Property>
<NameValue name="llp.lastCharTaxCode">N</NameValue>
</Property>
</UserArea>
</PurchaseOrderLine>
</PurchaseOrder>
</DataArea>
</SyncPurchaseOrder>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.