再帰的にテンプレートを適用する際に問題が発生しています。単純なXSL変換で数回働いたが、私はそれらの深い知識は持っていないと言いたい。 xsl変形後に再帰的にテンプレートを適用する
I有し方法でクラスを表し、
<classes>
<class name="A" author="Mr.X" >
<attribute name="i_" type="integer" visibility="protected" />
<attribute name="f_" type="float" visibility="private" />
<attribute name="c_" type="char" visibility="private" />
<method name="foo" return="integer" visibility="public" >
<param name="a" type="integer" />
<param name="b" type="integer" />
</method>
</class>
<class name="B" author="Mr.Y" >
<attribute name="s_" type="string" visibility="protected" />
<method name="bar" visibility="public" />
</class>
<class name="CA" author="Mr.Z" base="A" >
<attribute name="d_" type="double" visibility="protected" />
</class>
<class name="CB" author="Mr.Z" base="B" />
<class name="DCA" author="Mr.X" base="CA" >
<attribute name="s_" type="string" visibility="protected" />
</class>
</classes>
属性及びIは、両方自体からその基底クラスからすべての属性およびメソッドを有するクラスを含むXMLを取得したい次のXML OO継承と同じように動作します。
私は、次のXSLを書いたが、ちょうどクラスの継承の1つのレベルで動作し、次のXML
<classes>
<class name="A" author="Mr.X" >
<attribute name="i_" type="integer" visibility="protected" />
<attribute name="f_" type="float" visibility="private" />
<attribute name="c_" type="char" visibility="private" />
<method name="foo" return="integer" visibility="public" >
<param name="a" type="integer" />
<param name="b" type="integer" />
</method>
</class>
<class name="B" author="Mr.Y" >
<attribute name="s_" type="string" visibility="protected" />
<method name="bar" visibility="public" />
</class>
<class name="CA" author="Mr.Z" >
<attribute name="d_" type="double" visibility="protected" />
<!--[begin] inherited from base class A by Mr.X-->
<attribute name="i_" type="integer" visibility="protected" />
<attribute name="f_" type="float" visibility="private" />
<attribute name="c_" type="char" visibility="private" />
<method name="foo" return="integer" visibility="public" >
<param name="a" type="integer" />
<param name="b" type="integer" />
</method>
<!--[end] inherited from base class A-->
</class>
<class name="CB" author="Mr.Z" >
<!--[begin] inherited from base class B by Mr.Y-->
<attribute name="s_" type="string" visibility="protected" />
<method name="bar" visibility="public" />
<!--[end] inherited from base class B-->
</class>
<class name="DCA" author="Mr.X" >
<attribute name="s_" type="string" visibility="protected" />
<!--[begin] inherited from base class CA by Mr.Z-->
<attribute name="d_" type="double" visibility="protected" />
<!--[begin] inherited from base class A by Mr.X-->
<attribute name="i_" type="integer" visibility="protected" />
<attribute name="f_" type="float" visibility="private" />
<attribute name="c_" type="char" visibility="private" />
<method name="foo" return="integer" visibility="public" >
<param name="a" type="integer" />
<param name="b" type="integer" />
</method>
<!--[end] inherited from base class A-->
<!--[end] inherited from base class CA-->
</class>
</classes>
を取得したいと思います。もちろん
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/classes/import">
<xsl:comment>importing <xsl:value-of select="@file"/> file</xsl:comment>
<xsl:apply-templates select="document(@file)/classes/node()" />
</xsl:template>
<xsl:template match="*[@base]">
<xsl:variable name="bc" select="@base" />
<xsl:copy>
<xsl:apply-templates select="@*[name(.)!='base']"/>
<xsl:apply-templates select="/classes/class[@name=$bc]/@*[name(.)!='name' and name(.)!='author']" />
<xsl:apply-templates />
<xsl:comment>[begin] inherited from base class <xsl:value-of select="$bc"/> by <xsl:value-of select="//class[@name=$bc]/@author"/></xsl:comment>
<xsl:apply-templates select="/classes/class[@name=$bc]/node()" />
<xsl:comment>[end] inherited from base class <xsl:value-of select="$bc"/></xsl:comment>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
私はクラスが持っていることを、継承の最大レベル何度でも上記のように変換を適用する場合、I(ほぼ)所望の結果を得るが、私の目標はただ一つの変換でそれを取得することです。
ガイドがあれば幸いです。前もって感謝します。ここで
あなたの最初の問題は、1つの質問で十分です。別の質問を別途投稿してください。 –
私はそれを分割するために質問を編集し、私は別の投稿に2番目のものを投稿します。 – hmb