1

私の目的は、現在の子要素の 1 つが条件と等しい場合に、XML ファイルに新しい要素を追加することです。その条件が満たされない場合は、元の XML ファイルの現在のテンプレートを引き続き使用します。

以下に、現在 2 つの注文済みアイテムを含むサンプル XML ファイルがあります。XML ファイルの全体的な構造は同じままですが、顧客の注文は各 XML ファイルで一意であるため、注文されるアイテムの数は可変であり、追加の AlbumOrderItems を追加できます。

元の 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 というタイトルの 2 つの新しい追加要素が含まれています。これらは両方とも最初の 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 と等しい場合に 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>  
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 に答える