1

如果当前子元素之一等于条件,我的目标是向 XML 文件添加一个新元素。如果不满足该条件,则继续使用原始 XML 文件的当前模板。

我有一个示例 XML 文件,它下面当前包含 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>

如果 ProductCategory 等于“ALBUM”,则向 AlbumOrderItem 添加一个新元素。下面的示例 XML 输出包含两个新添加的元素,标题为:Package 和 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>  
4

2 回答 2

1

缺少引号和错误案例见下文

<xsl:template match="AlbumOrderItem[ProductCategory='ALBUM']">
于 2013-03-18T16:58:22.027 回答
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>
于 2013-03-18T19:52:56.520 回答