XSLT1.0を使用しています
次のようなXMLドキュメントのどこにでもある可能性のある特定の「num」要素を持つxmlがあるとします:-
<elem1>
<num>24</num>
</elem1>
<elem2>
<description>
<num>18</num>
</description>
</elem2>
<elem3>
<elem1>
<num>36</num>
</elem1>
</elem3>
に変換したい:-
<elem1>
<gcd multiple="4">6</gcd>
</elem1>
<elem2>
<description>
<gcd multiple="3">6</gcd>
</description>
</elem2>
<elem3>
<elem1>
<gcd multiple="6">6</gcd>
</elem1>
</elem3>
これで、次のような2つの要素のgcdを計算できるテンプレートができました:-
<xsl:template name="gcd">
<xsl:param name="x"/>
<xsl:param name="y"/>
<!-- snipping code to compute gcd that goes here -->
</xsl:template>
gcdのこのテンプレートを考えると、次のようにnum要素をループするようなことをしなければならないと思います:-
<xsl:variable name="global_gcd">
<xsl:for-each select="//ns0:num">
<!-- something probably goes here -->
<!-- say a temporary value x=0 initially -->
<!-- and then x = gcd (x, value of current node) -->
</xsl:for-each>
</xsl:variable>
そして、「num」のテンプレートでこの変数を使用して、属性とともに目的の「gcd」要素を生成できるとされています。それも私にできます。
上記のループはどのようになりますか?for-eachでない場合、2つの要素に対して有効なgcdテンプレートがすでにあると仮定して、XMLドキュメント内のすべての「num」要素のgcdを実際にどのように計算しますか?
すべての「num」要素を兄弟などとして持っていれば、これははるかに簡単だと思いますが、残念ながらそうではありません。これらのいずれか2つの間のツリー関係は、潜在的に任意である可能性があります。私が知っている唯一のことは、それらがすべて同じ名前を持っているということです。