Transformationsproblem mittels XSLT
Andi
- xsl
Hallo,
bei meinem vorigem Posting ist wohl was schief geggangen. Deshalb hier nocheinmal mein Problem.
zugrunde liegt folgendes XML-Dokument:
gml:featureMember
<bplan:BPlan gml:id="obj_0">
bplan:gkz4711</bplan:gkz>
bplan:datum2001-08-06</bplan:datum>
<bplan:ebene xlink:href="#obj_1"/>
</bplan:BPlan>
</gml:featureMember>
gml:featureMember
<bplan:BPlanEbene gml:id="obj_1">
bplan:ebene0</bplan:ebene>
bplan:bedeutung/
<bplan:gehoertZuBPlan xlink:href="#obj_0"/>
<bplan:fachobjekt xlink:href="#obj_62"/>
[..]
</bplan:BPlanEbene>
</gml:featureMember>
Diese XML- Dokuemnet möchte ich wie folgt transformieren:
gml:featureMember
<bplan:BPlan fid="obj_0">
bplan:gkz4711</bplan:gkz>
bplan:datum2001-08-06</bplan:datum>
bplan:ebene
<bplan:BPlanEbene fid="obj_1">
bplan:ebene0</bplan:ebene>
bplan:bedeutung/
<bplan:gehoertZuBPlan xlink:href="#obj_0"/>
</bplan:Ebene>
</bplan:ebene>
</bplan:BPlan>
</gml:featureMember>
Durch meine Transformation werden alle Elemente transformieren. Allerdings sollen alle bplan:fachobjekt Elemente nicht ins Zieldokument übernommen werden. Weiter soll das bplan:BPlan Element, welches nicht (wie im Quellfile zu sehen ist) nach dem bplan:ebene Element geschlossen wird, sondern alle folgenden Elemente beinhaltet (siehe Zieldokument.
Mein Ansatz ist:
<xsl:for-each select="//gml:featureMember/*">
<xsl:call-template name="objekt_bauen"/>
</xsl:for-each>
<xsl:template name="objekt_bauen">
<xsl:for-each select=".">
<xsl:element name="{name()}">
<xsl:attribute name="fid">
<xsl:value-of select="@gml:id"/>
</xsl:attribute>
<xsl:for-each select="node()">
<xsl:if test="not(bplan:fachobjekt)">
<xsl:element name="{name()}">
xsl:choose
<!--Hier stehen Ausgaben von Attributen, etc. -->
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
Besten Dank
andi
Hallo,
Durch meine Transformation werden alle Elemente transformieren. Allerdings sollen alle bplan:fachobjekt Elemente nicht ins Zieldokument übernommen werden. Weiter soll das bplan:BPlan Element, welches nicht (wie im Quellfile zu sehen ist) nach dem bplan:ebene Element geschlossen wird, sondern alle folgenden Elemente beinhaltet (siehe Zieldokument.
Mein Ansatz ist:<xsl:for-each select="//gml:featureMember/*">
Damit triffst jede "gml:featureMember" auch die mit dem Kind-Element "bplan:BPlanEbene" und führst auch für sie die Templateregel aus.
<xsl:template name="objekt_bauen">
<xsl:for-each select=".">
for-each ist hier unnötig, du führst bereits ein for-each für das Kind-Element / die Kind-Elemente von gml:featureMember aus.
So könnte aussehen was du möchtest:
-----------------------------------
<xsl:for-each select="//gml:featureMember[bplan:BPlan]/*">
<!-- nur für gml:featureMember die als Kind-Element ein bplan:BPlan haben-->
<xsl:call-template name="objekt_bauen"/>
</xsl:for-each>
<xsl:template name="objekt_bauen">
<!-- erstellt z.B. ein bplan:BPlan-Element -->
<xsl:element name="{name()}">
<xsl:attribute name="fid">
<xsl:value-of select="@gml:id"/>
</xsl:attribute>
<!-- für alle Kind-Elemente vom bplan:BPlan -->
<xsl:for-each select="*">
xsl:choose
<!-- bei Element bplan:ebene mache folgendes -->
<xsl:when test="name() = 'bplan:ebene'">
<xsl:element name="{name()}">
<!-- ruft das entsprechende Template auf -->
<xsl:apply-templates select="//gml:featureMember[bplan:BPlanEbene]" />
</xsl:element>
</xsl:when>
<!-- für alle anderen Kind-Elemente -->
xsl:otherwise
<xsl:element name="{name()}">
xsl:choose
<!--Hier stehen Ausgaben von Attributen, etc. -->
</xsl:choose>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="bplan:ebene">
</xsl:for-each>
</xsl:element>
</xsl:template>
<xsl:template match="gml:featureMember[bplan:BPlanEbene]">
<!-- matcht nur gml:featureMember-Elemente mit einem bplan:BPlanEbene Kind-Element -->
<!-- erstellt z.B. ein bplan:BPlanEbene]-Element -->
<xsl:element name="{name()}">
<xsl:attribute name="fid">
<xsl:value-of select="@gml:id"/>
</xsl:attribute>
<xsl:for-each select="*[name() != 'bplan:fachobjekt']">
<xsl:element name="{name()}">
xsl:choose
<!--Hier stehen Ausgaben von Attributen, etc. -->
</xsl:choose>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
--------------------------------------
Grüße
Thomas
PS: ist dir aufgefallen, dass du eigentlich keine Frage gestellt hast?