2013-03-18 39 views
1

我的目標是在XML文件中添加一個新元素,前提是其中一個子元素等於某個條件。如果不符合該條件,請繼續使用原始XML文件的當前模板。使用XSL添加基於XML參數的節點

我有一個示例XML文件,當前containts 2訂購的項目下面。 XML文件的整體結構將保持不變,但訂購的項目數量是可變的,可以添加額外的AlbumOrderItems,因爲客戶訂單對每個XML文件都是唯一的。

原始XML文件

<AlbumOrder> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <NumItems>2</NumItems> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
<AlbumOrderItem> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <PartnerOrderItemID>1</PartnerOrderItemID> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
    <ProductCategory>ALBUM</ProductCategory> 
    <Quantity>2</Quantity> 
<ShipAddress> 
    <FirstName>Joe</FirstName> 
    <LastName>Black</LastName> 
</ShipAddress> 
</AlbumOrderItem> 
<AlbumOrderItem> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <PartnerOrderItemID>2</PartnerOrderItemID> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
    <ProductCategory>CARD</ProductCategory> 
    <Quantity>1</Quantity> 
    <Package>10</Package> 
    <NumPrints>10</NumPrints> 
<ShipAddress> 
    <FirstName>Joe</FirstName> 
    <LastName>Black</LastName> 
</ShipAddress> 
</AlbumOrderItem> 
</AlbumOrder> 

如果產品分類等於「ALBUM」,然後將新元素添加到AlbumOrderItem.The示例XML輸出下面包含標題爲兩個新的添加元素: 打包和NumPrints 這些都是既加到第一AblumOrderItem

希望的輸出XML

<AlbumOrder> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <NumItems>2</NumItems> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
<AlbumOrderItem> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <PartnerOrderItemID>1</PartnerOrderItemID> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
    <ProductCategory>ALBUM</ProductCategory> 
    <Quantity>2</Quantity> 
    <Package>XY</Package>  ****NODE to add 
    <NumPrints>Z</NumPrints> ****NODE to add 
<ShipAddress> 
    <FirstName>Joe</FirstName> 
    <LastName>Black</LastName> 
</ShipAddress> 
</AlbumOrderItem> 
<AlbumOrderItem> 
    <PartnerCode>ABC Company</PartnerCode> 
    <AffiliateCode>abcpro</AffiliateCode> 
    <PartnerOrderID>449</PartnerOrderID> 
    <PartnerOrderItemID>2</PartnerOrderItemID> 
    <DateTime>03/14/2013 12:16 AM</DateTime> 
    <ProductCategory>CARD</ProductCategory> 
    <Quantity>1</Quantity> 
    <Package>10</Package> 
    <NumPrints>10</NumPrints> 
<ShipAddress> 
    <FirstName>Joe</FirstName> 
    <LastName>Black</LastName> 
</ShipAddress> 
</AlbumOrderItem> 
</AlbumOrder> 

我我目前正在處理下面的文件,但似乎並未應用所需的更改。它似乎只是在默認的XSL模板/規則上產生了原始XML的完整副本,可能基於 。我不確定下面是否有語法問題,特別是模板匹配參數。我也不確定如何通過整個XML文件中的所有ProductCategory元素來搜索或循環 。如果您有任何問題,請告訴我。如果ProductCategory等於ALBUM並且考慮多個AlbumOrderItems部分,任何幫助都將非常感謝,以便將節點添加到AlbumOrderItem。

當前XSL腳本

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:param name="TESTname">PACK_TEST</xsl:param> 
<xsl:param name="TESTvalue"><xsl:value-of select="AlbumOrder/AlbumOrderItem/Package"/> 
</xsl:param> 

<xsl:output method="xml"/> 
<xsl:template match="node()|@*"> 
<xsl:copy> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:copy> 
</xsl:template> 

<xsl:template match="AlbumOrderItem[ProductCategory=Album]"> 
<xsl:element name="{$TESTname}"><xsl:value-of select="$TESTvalue"/></xsl:element> 
<xsl:apply-templates select="node()|@*"/> 
</xsl:template> 
</xsl:stylesheet> 

回答

1

缺少報價和錯案見下文

<xsl:template match="AlbumOrderItem[ProductCategory='ALBUM']"> 
+0

不錯!現在正在添加基於語法更新的新節點,但我有一個新問題。現在,的整個第一個結束標記將被刪除或被刪除。 – loto33 2013-03-18 18:43:42

+0

這是因爲您需要在模板內容周圍設置''。 – JLRishe 2013-03-18 19:47:01

+0

感謝您的意見。一切都在工作! – loto33 2013-03-19 20:54:41

0

Treemonkey已經證明你在你的路徑有錯誤。如果您對如何在您指定的特定位置(在ShipAddress之前)插入這些節點感興趣,則可以這樣操作:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*" /> 
    <xsl:param name="TESTname">PACK_TEST</xsl:param> 
    <xsl:param name="TESTvalue"> 
    <xsl:value-of select="AlbumOrder/AlbumOrderItem/Package"/> 
    </xsl:param> 

    <xsl:template match="@* | node()" name="Copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="AlbumOrderItem[ProductCategory = 'ALBUM']/ShipAddress"> 
    <xsl:element name="{$TESTname}"> 
     <xsl:value-of select="$TESTvalue" /> 
    </xsl:element> 
    <xsl:call-template name="Copy" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

完美的例子...我將添加額外的節點,以便將來的適當位置派上用場 – loto33 2013-03-19 20:56:16

+0

@ loto33很高興我能提供幫助。請記住提出有用的答案並接受你認爲最好的答案。 :) – JLRishe 2013-03-20 06:18:17