2016-09-01 3 views
0

私が直面している問題に対する正しいアプローチを見つけるのには苦労しています。
は、I「はXML2」二重一致のためのfor-eachのネスト

両方に存在する「PRODID」属性を介し「XML1」と「XML2」の整合における製品要素の属性「colorDefを」で、「XML1」の「色」ノードを更新する必要があります

特定の「citem」(すべてではない)のみを更新する必要があります。「citem」要素を更新する必要があります。「cit」要素は、「type」のサブ要素が等しい場合に更新する必要があります。 'FavType'要素に変換します。

XML1:

<?xml version="1.0" encoding="utf-8"?> 
<Products> 
    <Product prodId="390"> 
     <FavType>XX2</FavType> 
     <citem> 
      <type>XX1</type> 
      <color>Green</color> 
     </citem> 
     <citem> 
      <type>XX2</type> 
      <color>Blue</color> 
     </citem> 
     <citem> 
      <type>XX3</type> 
      <color>Red</color> 
     </citem> 
    </Product> 
</Products> 

XML2:

<?xml version="1.0" encoding="utf-8"?> 
<OrderCatalog> 
    <Product prodId="390"> 
     <Item colorDef='Yellow'>Tusk</Item>  
    </Product> 
    <Product prodId="500">  
     <Item colorDef='Yellow'>Dowel</Item>   
    </Product> 
</OrderCatalog> 

必要な出力:

<?xml version="1.0" encoding="utf-8"?> 
<Products> 
    <Product prodId="390"> 
     <FavType>XX2</FavType> 
     <citem> 
      <type>XX1</type> 
      <color>Green</color> 
     </citem> 
     <citem> 
      <type>XX2</type> 
      <color>Yellow</color> 
     </citem> 
     <citem> 
      <type>XX3</type> 
      <color>Red</color> 
     </citem> 
    </Product> 
</Products> 

コード、現在は最初requirmnet解決:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 


    <xsl:param name="f1" select="'xml20.xml'"/> 
    <xsl:variable name="doc1" select="document($f1)"/> 

    <xsl:key name="k1" match="OrderCatalog/Product" use="@prodId"/> 

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

    <xsl:template match="Products/Product/citem" > 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:variable name="prodId" select="../@prodId"/> 
      <xsl:for-each select="$doc1"> 
       <color> 
        <xsl:value-of select="key('k1', $prodId)/Item/@colorDef"/> 
       </color> 
      </xsl:for-each> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
を10

どのような方法が適していますか? for-eachにネストされていますか?

更新:回答怒鳴るから 新しいXSL:場合

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 


    <xsl:param name="f1" select="'x20.xml'"/> 
    <xsl:variable name="doc1" select="document($f1)"/> 

    <xsl:key name="k1" match="OrderCatalog/Product" use="@prodId"/> 

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

    <xsl:template match="Products/Product/citem[type=../FavType]/color" > 
    <xsl:copy> 

     <xsl:variable name="prodId" select="../../@prodId"/> 
     <xsl:for-each select="$doc1"> 
      <xsl:value-of select="key('k1', $prodId)/Item/@colorDef"/> 
     </xsl:for-each> 

    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

はXML2に存在しないXML1にPRODID、私はこの取得しています:代わりに、元の

<citem> 
    <type>XX2</type> 
    <color/> 
    </citem> 

<citem> 
      <type>XX2</type> 
      <color>Blue</color> 
    </citem> 

答えて

0

私は「色」属性と「XML1」のノードを、更新する必要がある「colorDef」 製品の要素の「XML2」に

をあなただけcolorを更新したい場合は、テンプレートがそれと一致していない理由その親の代わりに直接citem

<xsl:template match="Products/Product/citem[type=../FavType]/color" > 
    <xsl:copy> 
     <xsl:variable name="prodId" select="../../@prodId"/> 
     <xsl:for-each select="$doc1"> 
      <xsl:value-of select="key('k1', $prodId)/Item/@colorDef"/> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
+0

私の悪い、いつものように、私は基本的な例を提示する。しかし実際には、私はcitemの下でいくつかの要素を更新していますが、私は上記を繰り返すことができますが、それは効率的ではありません。 – yuris

+0

"*私はcitemでいくつかの要素を更新します*"だから?テンプレートも作成してください。または、好きな場合は、特定の 'citem'のテンプレートを作成します(上記のマッチパターンから'/color'部分を削除してください)。そしてそこから子を処理します。 –

+0

xml2に一致するprodIdがない場合は、 の問題がまだ残っていますが、 'FavType'と一致する 'color'要素が削除されます。 なぜそれが起こるのですか? – yuris

関連する問題