2016-10-06 1 views
1

このXMLが与えられた場合、私は再作成できるように@associatedIdという右側に "flag-end"要素を設定する必要がありますxsl:iterateを使用してフラグから要素を削除します。要素を作成する方法を知っていますが、私が理解できないことは、各フラグの最後に@associatedIdを適切に埋め込む方法です。 (これは、私たちは、私は常に開始と終了フラグの数と同じ数を保証することだし、エンドフラグの適切な数は、開始フラグの適切な数に従うこと。使用するサードパーティソフトウェアに必要です。)xsl:iterateを使用して空でない要素にすることができる要素のペアを特定する方法

<outer> 
     hello 
     <flag-start associatedId="test3"/> 
     <flag-start associatedId="test"/> 
     <span>wor<b>---</b>ld</span> 
     <flag-start associatedId="test4"/> 
     <flag-end/> 
     <flag-start associatedId="test2"/> 
     <flag-end/> 
     <flag-end/> 
     <flag-end/> 
     <flag-start associatedId="test5"/> 
     <flag-end/> 
     some more text 
    </outer> 

これは、所望のXML出力である:このような

<outer> 
     hello 
     <flag-start associatedId="test3"/> 
     <flag-start associatedId="test"/> 
     <span>wor<b>---</b>ld</span> 
     <flag-start associatedId="test4"/> 
     <flag-end associatedId="test4"/> 
     <flag-start associatedId="test2"/> 
     <flag-end associatedId="test2"/> 
     <flag-end associatedId="test"/> 
     <flag-end associatedId="test3"/> 
     <flag-start associatedId="test5"/> 
     <flag-end associatedId="test5"/> 
     some more text 
    </outer> 
+0

ジョブの一部であるコードはありますか?次に、現在の出力とともに表示してください。また、 'xsl:iterate'として使用したいXSLTバージョンをXSLT 3.0であることを明確にしてください。そうすればそれを明確にすることができます。 –

答えて

1

何か:テストされていない

<xsl:iterate select="*"> 
    <xsl:param name="stack" select="()"/> 
    <xsl:choose> 
    <xsl:when test="self::flag-start"> 
     <xsl:copy-of select="."/> 
     <xsl:next-iteration> 
     <xsl:with-param name="stack" select="@associatedID, $stack"/> 
     </xsl:next-iteration> 
    </xsl:when> 
    <xsl:when test="self::flag-end"> 
     <xsl:copy> 
     <xsl:attribute name="associatedId" select="head($stack)"/> 
     </xsl:copy> 
     <xsl:next-iteration> 
     <xsl:with-param name="stack" select="tail($stack)"/> 
     </xsl:next-iteration> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:copy-of select="."/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:iterate> 

。データが信頼できるものであると仮定します。

+0

ありがとう、Dr. Kay。これは洗練されたソリューションであり、xsl:iterate moreを使用することを楽しみにしています。 xsl:sequenceの代わりにxsl:copy-ofの使用についてお問い合わせできますか?私は後者が(ほとんど)常に前者よりも優先されるべきだと考えました。 – SpringSteven

+0

私はそのような状況では、習慣の力によってxsl:copy-ofを使用する傾向があります。あなたが関数や変数の中にいなければ、Saxonには何の違いもありません。 –

+0

説明をありがとう。私はサクソンがこの場合に最適化すると考えました。 – SpringSteven

関連する問題