私が直面している問題に対する正しいアプローチを見つけるのには苦労しています。
は、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>
私の悪い、いつものように、私は基本的な例を提示する。しかし実際には、私はcitemの下でいくつかの要素を更新していますが、私は上記を繰り返すことができますが、それは効率的ではありません。 – yuris
"*私はcitemでいくつかの要素を更新します*"だから?テンプレートも作成してください。または、好きな場合は、特定の 'citem'のテンプレートを作成します(上記のマッチパターンから'/color'部分を削除してください)。そしてそこから子を処理します。 –
xml2に一致するprodIdがない場合は、 の問題がまだ残っていますが、 'FavType'と一致する 'color'要素が削除されます。 なぜそれが起こるのですか? – yuris