Announcement

Collapse
No announcement yet.

redundante Elemente filtern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • redundante Elemente filtern

    Hallo,

    ich bin recht neu im Thema XSLT und hoffe mir kann hier geholfen werden. Mein Problem ist folgendes:

    Ich möchte ein XSLT-Template schreiben, welches als Parameter einen beliebigen Knoten bekommen kann. Die Elemente, die dann unter diesem Knoten auftauchen, sollen auf doppelte Elemente untersucht werden, so dass ich am Ende eine Sequenz von einzigartigen Elementen bekomme.

    Um das ganze etwas zu veranschaulichen:
    so sieht eine Beispiel-XML-Struktur aus:
    Code:
    <Wurzel>
     <Element typ="A"/>
     <Element typ="A"/>
     <Element typ="B"/>
     <Element typ="C"/>
     <Element typ="C"/>
     <Element typ="A"/>
     <Element typ="C"/>
    </Wurzel>
    Nach der Transformation sollen keine Elemente des gleichen Typs mehrmals vorkommen:

    Code:
    <Wurzel>
     <Element typ="A"/>
     <Element typ="B"/>
     <Element typ="C"/>
    </Wurzel>
    Ich bin schon lange am rumprobieren und mein letzter Stand ist folgender:
    Code:
    <xsl:template match="*">
        <xsl:call-template name="merge_multiple">
        <xsl:with-param name="string" select="."/>
        </xsl:call-template>
      </xsl:template>
    
      <xsl:template name="merge_multiple">
        <xsl:param name="string" select="."/>
        <xsl:for-each select="$string">
        <xsl:sort select="." />
        <xsl:if test="not(preceding-sibling=.)">
          <xsl:value-of select="."/>
        </xsl:if>
        </xsl:for-each>
      </xsl:template>
    Leider funktioniert das Ganze so nicht . Ich wäre sehr dankbar, wenn mir jemand auf die Sprünge helfen könnte.

    Grüße,

    Paul L.

  • #2
    Versuche es mal mit den XSLT FAQ [Duplicates].

    Comment


    • #3
      Danke, das hat weitergeholfen!

      Ich habe das Problem wie folgt gelöst:

      Code:
        <xsl:key name="types-list" match="*" use="@typ" />
      
        <xsl:template name="merge_multiple_types">
          <xsl:param name="node" select="."/>
          <xsl:value-of select="$node[(key('types-list', @typ)[2] and  
          count(.|key('types-list', @typ)[1]) = 1) or
          count(.|key('types-list', @typ)[1]) = 1 ]/@typ"/>
        </xsl:template>
      Grüße,

      Paul L.

      Comment


      • #4
        <?xml version="1.0"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xslutput method="xml" indent="yes"/>

        <xsl:template match="/">
        <Wurzel>
        <xsl:apply-templates select="Wurzel/Element">
        <xsl:with-param name="att" select="Wurzel/Element/@typ"/>
        </xsl:apply-templates>
        </Wurzel>
        </xsl:template>


        <xsl:template match="Element">
        <xsl:apply-templates select="@typ">
        <xsl:with-param name="att" select="@typ"/>
        </xsl:apply-templates>
        </xsl:template>




        <xsl:template match="@typ">
        <xslaram name="att"/>
        <xsl:if test="count(../preceding-sibling::Element[@typ=$att])=0">
        <xsl:element name="element">
        <xsl:attribute name="typ">
        <xsl:value-of select="$att"/>

        </xsl:attribute>
        </xsl:element>
        </xsl:if>
        </xsl:template>
        </xsl:stylesheet>

        Comment

        Working...
        X