Ich habe Probleme, eine Vorlage rekursiv anzuwenden. Ich würde gerne sagen, dass ich, obwohl ich ein paar Mal mit einfachen XSL-Transformationen gearbeitet habe, kein tiefes Wissen über sie habe.xsl apply-templates rekursiv nach der Umwandlung
Ich habe die folgende XML, die
<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>
und ich würde eine XML erhalten, die die Klassen mit allen Attributen und Methoden enthält, die beide von sich selbst und von dieser Basisklasse Klassen mit Methoden und Attribute repräsentiert gerne , genauso wie die OO-Vererbung funktioniert.
würde Ich mag die folgende 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>
Ich schrieb das folgende XSL erhalten, funktioniert aber nur für eine Ebene der Klassenvererbung.
<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>
Natürlich, wenn ich die obige Transformation so oft wie die maximale Höhe der Vererbung gelten, dass die Klassen, ich (fast) erhalten das gewünschte Ergebnis, aber mein Ziel ist es, in nur einer Transformation zu erhalten .
Jeder Leitfaden würde sehr geschätzt werden. Danke im Voraus.
Ihr erstes Problem ist mehr als genug für eine Frage. Bitte posten Sie Ihre andere Frage separat. –
Ich bearbeite die Frage, um sie zu teilen, und ich werde die zweite in einem anderen Beitrag veröffentlichen. – hmb