Announcement

Collapse
No announcement yet.

Stringvergleich und löschen doppelter Teilstrings

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

  • Stringvergleich und löschen doppelter Teilstrings

    Hallo,

    ich hoffe ihr könnt mir bei folgendem Problem weiterhelfen.
    Ich habe folgende XML-Vorlage:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <testlibrary xmlns:fn="http://www.w3.org/2005/xpath-functions">
       <test name="Test1">
          <teststep name="Schritt1">
            <setup>p48 p33 p21 p136 p620 </setup>
          </teststep>
          <teststep name="Schritt2">
            <setup>p48 p39 p21 p133 p620 </setup>
          </teststep>
       </test>
       <test name="Test2">
          <teststep name="Schritt1">
            <setup>p48 p39 p21 p133 p620 </setup>
          </teststep>
          <teststep name="Schritt2">
            <setup>p48 p39 p18 p136 p620 </setup>
          </teststep>
          <teststep name="Schritt3">
            <setup>p48 p39 p21 p133 p620 </setup>
          </teststep>
       </test>
    </testlibrary>
    Ziel ist es die Teilstrings der Elemente <setup> zu vergleichen und nur die Teilstrings über zu behalten, die nicht im vorherigen <teststep>/<setup> - Element enthalten sind. Also doppelte Teilstrings sollen verworfen werden.

    Zielausgabe:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <testlibrary xmlns:fn="http://www.w3.org/2005/xpath-functions">
       <test name="Test1">
          <teststep name="Schritt1">
            <setup>p48 p33 p21 p136 p620 </setup>
          </teststep>
          <teststep name="Schritt2">
            <setup>p39 p133 </setup>
          </teststep>
       </test>
       <test name="Test2">
          <teststep name="Schritt1">
            <setup>p48 p39 p21 p133 p620 </setup>
          </teststep>
          <teststep name="Schritt2">
            <setup>p18 p136 </setup>
          </teststep>
          <teststep name="Schritt3">
            <setup>p21 p133 </setup>
          </teststep>
       </test>
    </testlibrary>
    Habe nun schon einiges probiert, aber keine Lösung gefunden. Eventuell über distinct-values() , translate() oder substring(). Mir fehlt ein wenig die Erfahrung im Handling mit den XSL-Funktionen. Hoffe jemand hat eine Idee. Sonst muss ich das ganze doch mit Java anpacken.

    Danke für eventuelle Mühen.

    Ciao.

  • #2
    so vielleicht? Pfade muss man halt noch anpassen

    Code:
    <xsl:choose>
        <xsl:when test="setup = preceding-sibling::setup[1]">
        </xsl:when>
        <xsl:otherwise>
              <xsl:value of select="setup"/>
        </xsl:otherwise>
    </xsl:choose>

    Comment


    • #3
      Da die XPath-Funktion fn:distinct-values() erwähnt wurde (und genau diese hier zum Ziel führt), setze ich die Möglichkeit des Einsatzes von XSLT/XPath 2.0 voraus. So sollte die gesuchte Ausgabe entstehen (Identitäts-Template für die generelle Ausgabe aller unveränderlichen Inhalte und separate Behandlung von teststep/setup):
      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"
        exclude-result-prefixes="fn xs">
      
        <xsl:template match="@* | node()">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>  
        </xsl:template>
        
        <xsl:template match="teststep">
          <teststep>
            <setup>
              <xsl:variable name="setup1" select="fn:tokenize(fn:normalize-space(setup),'\s')"/>
              <xsl:variable name="setup2" select="fn:tokenize(preceding-sibling::teststep[1]/setup,'\s')"/>
              <xsl:value-of select="fn:distinct-values($setup1[not(.=$setup2)])"/>
            </setup>
          </teststep>
        </xsl:template>
        
      </xsl:stylesheet>
      Hinweise: Es ginge natürlich auch ohne die beiden Variablen, aber so schreibt und liest es sich besser. Die Verwendung von fn:normalize-space() dient nur der Vermeidung von Leerzeichen am Anfang/Ende der Ausgabe bei den vollständig erhaltenen setup-Inhalten.

      Ergebnis:
      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <testlibrary xmlns:fn="http://www.w3.org/2005/xpath-functions">
        <test name="Test1">
          <teststep>
            <setup>p48 p33 p21 p136 p620</setup>
          </teststep>
          <teststep>
            <setup>p39 p133</setup>
          </teststep>
        </test>
        <test name="Test2">
          <teststep>
            <setup>p48 p39 p21 p133 p620</setup>
          </teststep>
          <teststep>
            <setup>p18 p136</setup>
          </teststep>
          <teststep>
            <setup>p21 p133</setup>
          </teststep>
        </test>
      </testlibrary>
      Zuletzt editiert von Thomas Meinike; 19.02.2009, 19:00.

      Comment


      • #4
        Danke für die Hilfe,

        @Thomas: Genau das war mein Ziel. Danke für die ausführliche Erläuterung. Wieder ein paar neue Funktionen kennengelernt. Und es werden täglich mehr! Hätte nicht gedacht dass XSLT doch so umfangreiche Möglichkeiten bieten. Leider aber auch sehr umständlich in der Anwendung.

        Frage: Gibt es eigentlich einen Editor für XSL-Dateien, der Syntaxprüfungen, Intellisense u.s.w. bietet??? Altova sicherlich, aber vielleicht auch Freeware oder OpenSource? Im Moment nutze ich, wie für fast alles was zu coden ist, Notepad++. Der unterstützt zumindestens die xml-Syntax. Bischen mehr Unterstürzung wäre aber ganz nett für mich, als verwöhnter Eclipse und VisualStudio Nutzer

        Ciao. Und danke nochmals.

        Comment


        • #5
          Von Liquid XML Studio gibt es eine freie Community-Version, die schon einigen Komfort bringt. Auch der XML Copy Editor ist hilfreich.

          Nachtrag: Vielleicht liefert dieser Vortrag noch weitere Anregungen zum Thema XSLT/XPath 2.0.
          Zuletzt editiert von Thomas Meinike; 24.02.2009, 13:23.

          Comment

          Working...
          X