2016-04-29 6 views
0

CSVをXMLに変換するためにXSLTスタイルシートを使用していますが、CSV変換後にいくつかのテンプレートを使用してXMLを変換する必要もあります。ここで<UPCs><UPC>ノードをラップするはずのスタイルシートの抜粋です新しい親ノードにノードをラップしますか?

<UPCs> <UPC>031878025147</UPC> <UPCs>

<?xml version='1.0' encoding='UTF-8'?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="fn" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    version="2.0" exclude-result-prefixes="xs fn"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" /> 

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

    <xsl:template match="//UPC[preceding-sibling::ExternalId]"> 
     <xsl:variable select="." name="curElem" /> 
     <xsl:for-each select="."> 
     <UPCs> 
      <xsl:copy-of select="$curElem" /> 
     </UPCs> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

はここに以下のように任意の<UPC>031878025147</UPC>ノードをラップすることになっているスタイルシートの一部であります

<Feed name="example" incremental="false" extractDate="2016-04-28T13:42:09-05:00" xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/14.5"> 
    <Brands> 
    <Brand removed="false"> 
     <ExternalId>brands</ExternalId> 
     <Name>Brands</Name> 
     <!--BrandPageUrl>http://www.kolcraft.com/brands.html</BrandPageUrl--> 
    </Brand> 
    <!-- ... --> 
    </Brands> 
    <Categories> 
    <Category removed="false"> 
     <ExternalId>baby-products</ExternalId> 
     <Name>Baby Products</Name> 
     <CategoryPageUrl>http://www.kolcraft.com/baby-products.html</CategoryPageUrl> 
    </Category> 
    </Categories> 
    <Products> 
    <Product> 
     <ExternalId>ED003-QCX</ExternalId> 
     <UPC>031878025147</UPC> 
     <Name>Sealy Naturals-Cotton Crib Mattress Pad</Name> 
     <Description>Give baby plush comfort from natural cotton fibers with the innovative Sealy Naturals-Cotton Crib Mattress Pad.</Description> 
     <ProductPageUrl>http://www.kolcraft.com/sealy-naturals-cotton-crib-mattress-pad.html</ProductPageUrl> 
     <ImageUrl>http://www.kolcraft.com/media/catalog/product/e/d/ed003-qcx-1_1_4.jpg</ImageUrl> 
     <CategoryExternalId>crib-bedding</CategoryExternalId> 
    </Product> 
    <!-- ... --> 
    </Products> 
</Feed> 

ただし、tを解析するXMLのスニペット彼は親<UPCs>ノードの外にある<UPC>ノードを捕まえていないようです。私はここで何が欠けていますか?どんな助けも歓迎です。

+1

処理対象のxmlのスニペットを追加できますか? – bknights

+0

ちょうどそれを追加しました。 :) –

答えて

1

あなたがXMLで

<Feed ... xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/14.5"> 

をデフォルトの名前空間宣言を持っているので、これはこれはFeed要素を意味していると、すべての子孫の要素は、その名前空間にあります。しかし、あなたのXSLTはこの名前空間に取り込まれていないので、同じものではない名前空間にない要素UPCと一致するように探しています。

XSLT 2.0を使用しているので、xpath-default-namespaceを実際に使用して、テンプレートマッチのようなxp​​ath式のデフォルト名前空間を指定することができます。新しいUPCsが同じ名前空間に出力されるように、XSLTのデフォルト名前空間も定義する必要があります。

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="fn" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xpath-default-namespace="http://www.bazaarvoice.com/xs/PRR/ProductFeed/14.5" 
    xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/14.5" 
    version="2.0" exclude-result-prefixes="xs fn"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" /> 

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

    <xsl:template match="UPC[preceding-sibling::ExternalId]"> 
     <UPCs> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     </UPCs> 
    </xsl:template> 
</xsl:stylesheet> 

(注)このXSLTを試してみて、私はのために、各ステートメントに変数の新しいを見ることができなかったとして、私はまた、テンプレートを単純化しています。

EDIT:コメントに応じて、テンプレートマッチの開始時にダブルスラッシュ//を使用する必要はありません。

+0

:)それはトリックでした!ありがとうございました! –

+0

はい、そうです。この例ではダブルスラッシュは不要なので、削除しました。ありがとう! –

関連する問題