Announcement

Collapse
No announcement yet.

Anfängerfragen <xsl:if /> und Whitespaces

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

  • Anfängerfragen <xsl:if /> und Whitespaces

    Hallo Forumgemeinde,

    ich freunde mich so langsam mit xslt an, aber einige Rätsel bleiben noch bei denen ich um Eure Hilfe bitte.

    1: Ich kenne die if - Anweisung in der Form

    Code:
    <xsl:if test="starts-with('.',.)">
      <xsl:do-something>
    </xsl:if>
    Wie kann man hier auf Ungleichheit prüfen, also genau dann etwas abarbeiten, wenn test != "starts-with('.',.)" ?

    Folgendes geht alles nicht:
    Code:
    <xsl:if test != "starts-with('.',.)"> 
    
    <xsl:if NOT test="starts-with('.',.)>
    Wie macht man das?
    Habe jetzt mit <xsl:choose> einen Workaround, aber das geht doch bestimmt besser.

    2. Auszug aus einer XML - Datei

    Code:
    ..
    <value>KEY1=VALUE1
    KEY2=VALUE2,VALUE3
    KEY3=VALUE1
    </value>
    ..
    Der Knackpunkt ist, das hier signifikante Werte durch whitespaces (0D0A) getrennt sind. Inwieweit sowas üblich ist sei mal dahingestellt.
    Kann ich das irgendwie splitten?

    ein substring-before($str , &#xD;&#xA; ) tut's nicht, auch bei contains($str, &#xD;&#xA; ) kommt der Fehler "A name contained an invalid character".

    Kann man in diesen Stringfunktionen überhaupt nach whitspaces suchen ?

    Danke !
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

  • #2
    Gemeint ist wohl eher starts-with(.,'.'), also finde den zweiten String am Anfang des ersten (hier im Kontextknoten). Das Gegenstück wäre not(starts-with(.,'.')).

    Zu den Zeilenumbruchzeichen: Diese müssen natürlich auch in '...' stehen, probiere es mal mit '&#xA;' allein. Je nach Prozessor werden auch CRLF in LF umgewandelt. Ansonsten bietet sich eher die Funktion normalize-space($str) und eine rekursive Zerlegung der KEY/VALUE-Paare an. Ansätze dazu gab es hier bereits.

    Comment


    • #3
      Hallo,

      super, vielen Dank!

      Das "not" in xslt kein Operator sondern eine Funktion ist, also not(), habe ich leider übersehen. Bin halt erst am Anfang .
      (Die Argumente von starts-with() waren natürlich in meinem Post auch vertauscht)

      Auf die Idee, die &#xD;&#xA; in ' ' einzuschließen kam ich auch nicht, weil, verzeiht bitte, aber für einen Delphi - Programmierer ist das nicht gerade naheliegend.
      Jedenfalls
      Code:
      <xsl:when test="contains($str,'&#xD;&#xA;')">
      funktioniert wie gewünscht (wobei ich noch gespannt bin, wie das auf den Kundenrechnern aussieht)

      Schließlich habe ich die Rekursion aus diesem Thread schon vergangene Woche bewundert und für mich angepasst, so dass ich jetzt eine funktionierende Lösung habe.

      Wunderbar, vielen, vielen Dank, Thomas!

      Falls es jemand braucht, hier nochmal die rekursive Stringzerlegung - wie gesagt, die Idee stammt von Thomas Meinike :

      Code:
      <xsl:template match="data" > 
         <xsl:for-each select="value">
             <xsl:call-template name="strsplit">
               <xsl:with-param name="str" select="concat(.,'&#xD;&#xA;')"/>
             </xsl:call-template>
         </xsl:for-each>	
      </xsl:template>
      
      <xsl:template name="strsplit">
        <xsl:param name="str"/>
          <xsl:if test="contains($str,'&#xD;&#xA;')">
           <xsl:text/>Do something with line <xsl:value-of select="substring-before($str,'&#xD;&#xA;')"/><xsl:text/>
           <xsl:call-template name="strsplit">
              <xsl:with-param name="str" select="substring-after($str,'&#xD;&#xA;')"/>
           </xsl:call-template>
        </xsl:if>
      </xsl:template>
      PS Offtopic
      Obwohl ich offensichtlich nur an der Oberfläche kratze - xslt ist eine ganz heisse, ein wenig esoterische Sprache. Eine spannende Sache!
      Ich habs gleich!
      ... sagte der Programmierer.

      Comment

      Working...
      X