Andi: Transformationsproblem mittels XSLT

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:gkz>4711</bplan:gkz>
  <bplan:datum>2001-08-06</bplan:datum>
  <bplan:ebene xlink:href="#obj_1"/>
 </bplan:BPlan>
</gml:featureMember>
<gml:featureMember>
 <bplan:BPlanEbene gml:id="obj_1">
  <bplan:ebene>0</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:gkz>4711</bplan:gkz>
  <bplan:datum>2001-08-06</bplan:datum>
  <bplan:ebene>
   <bplan:BPlanEbene fid="obj_1">
    <bplan:ebene>0</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

  1. 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?