2012-01-02 8 views
1
<product id="456"> 
<product id="457" defective="yes"> 
<product id="458"> 
<product id="459"> 
<product id="460" defective="yes"> 

コンテキストノードがプロダクト460の場合、そのノードと先行する兄弟を最後の不良ノードに戻す必要があります。つまり、製品458,459、および460にはそれぞれが必要ですが、457またはそれ以前には必要ありません。最新の兄弟の状態に戻す

コンテキストノードがすべての製品を順番に反復処理しているとは見なされません。

答えて

2

この変換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kPreceding" match="product" use= 
"generate-id(
    (self::product|following-sibling::product) 
          [@defective='yes'][1] 
      )"/> 

<xsl:template match="product[last()]"> 
    <xsl:copy-of select="key('kPreceding', generate-id())"/> 
</xsl:template> 
</xsl:stylesheet> 

設けXMLに塗布(整形式に補正!!!):

<t> 
    <product id="456"/> 
    <product id="457" defective="yes"/> 
    <product id="458"/> 
    <product id="459"/> 
    <product id="460" defective="yes"/> 
</t> 

募集、正しい結果を生成します

<product id="458"/> 
<product id="459"/> 
<product id="460" defective="yes"/> 

説明:(このproductに欠陥自体である場合、または自己)欠陥がある第一次、兄弟productgenerate-id()によって任意の製品をインデックスするためのキーを使用して

+0

ニート!私は、プロセッサがキー生成を最適化して、n乗の問題にならないと仮定していると思います。 – JPM

+0

インデックスの構築はO(N)で、インデックスから値を取得するのはO(1)です。これは良いハッシュテーブルの実装とまったく同じです。 –

+0

これはまた、ノードにスイープして値を割り当てる戦略(次の「不良品」など)に関する以前の質問にも答えています。一般的な戦略:ノードに値を割り当てないでください。代わりに値を含むキーテーブル(またはグローバル変数)を作成します。とった。ありがとう。 – JPM

関連する問題