繁体   English   中英

在许多行上应用xslt模板

[英]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.

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