使用XSL基于XML参数添加节点

使用XSL基于XML参数添加节点,xml,xslt,add,Xml,Xslt,Add,我的目标是在当前子元素之一等于某个条件时向XML文件添加新元素。如果不满足该条件,请继续使用原始XML文件的当前模板 下面是一个示例XML文件,其中当前包含2个已订购的项目。XML文件的整体结构将保持不变,但订购的项目数量将是可变的,这可以添加额外的AlbumOrderItems,因为每个XML文件的客户订单都是唯一的 原始XML文件 <AlbumOrder> <PartnerCode>ABC Company</PartnerCode> <

我的目标是在当前子元素之一等于某个条件时向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>

ABC公司
abcpro
449
2.
2013年3月14日12时16分
ABC公司
abcpro
449
1.
2013年3月14日12时16分
专辑
2.
乔
黑色
ABC公司
abcpro
449
2.
2013年3月14日12时16分
卡片
1.
10
10
乔
黑色
如果ProductCategory等于“ALBUM”,则向AlbumOrderItem添加新元素。下面的示例XML输出包含两个新添加的元素,标题为: 包装和印刷品 它们都添加到了第一个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>

ABC公司
abcpro
449
2.
2013年3月14日12时16分
ABC公司
abcpro
449
1.
2013年3月14日12时16分
专辑
2.
要添加的XY****节点
要添加的Z****节点
乔
黑色
ABC公司
abcpro
449
2.
2013年3月14日12时16分
卡片
1.
10
10
乔
黑色
我目前正在处理下面的文件,但它似乎没有应用所需的更改。它似乎只是生成了原始XML的完整副本,可能是基于XML的 在默认XSL模板/规则上。我不确定下面是否有语法问题,尤其是模板匹配参数。我也不知道如何搜索或循环 通过整个XML文件中的所有ProductCategory元素。如果你有任何问题,请告诉我。若ProductCategory等于ALBUM,则若要将节点添加到AlbumOrderItem,并考虑多个AlbumOrderItems部分,请提供任何帮助

当前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>  

包装试验

缺少引号和错误的大小写请参见下文

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

缺少引号和错误的大小写请参见下文

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

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>

包装试验

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>

包装试验

不错!现在正在根据语法更新添加新节点,但我有一个新问题。的整个第一个结束标记正在退出或被删除。这是因为您需要在模板内容周围添加一个
。很好!现在正在根据语法更新添加新节点,但我有一个新问题。的整个第一个结束标记正在退出或被删除。这是因为您需要在模板的内容周围添加一个
。完美的示例…我将添加其他节点,以便在future@loto33很高兴我能帮忙。请记住对有帮助的答案进行投票,并接受你认为最好的答案。:)完美的例子…我将添加额外的节点,以便在future@loto33很高兴我能帮忙。请记住对有帮助的答案进行投票,并接受你认为最好的答案。:)