Jan: Formatierungen sicherstellen

Hallo zusammen,

ich möchte in meinem xsl-stylesheet bestimmte Formate sicherstellen. Beispielsweise soll die Verlinkung von Email-Adressen auch korrekterweise mit dem "mailto:"-Befehl beginnen, selbst wenn der Eintrag im xml-file nicht korrekt bzw. unvollständig ist. Ich habe mir überlegt, dass es am sinnvollsten ist, am Ende des xsl-stylesheets folgenden Eintrag einzufügen:

<xsl:template match="A">
  xsl:choose
   <xsl:when test="contains(@href,'@')">
    <a>
     <xsl:attribute name="href">
      <xsl:value-of select="concat('mailto:',@href)" />
     </xsl:attribute>
     <xsl:apply-templates />
    </a>
   </xsl:when>
   xsl:otherwise
    <a href="{@href}">
     <xsl:apply-templates />
    </a>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

Aufgrund der Tatsache, dass die <A>-Tags, die ursprünglich im xml-file stehen, gross geschrieben werden, und die neuen zu setzenden Tags entsprechend klein geschrieben werden, kann ich bereits am html-Output erkennen, dass diese Format-Überprüfung nicht stattfindet. Der nicht geänderte Inhalt des Attributes href zeigt dies natürlich auch. Es muss also schon an der Adressierung der Tags liegen. Ich würde die Formatierung allerdeings gerne so gestalten, dass jegliche <A>-Tags, egal in welchem Unterknoten sie sich befinden, entsprechend formatiert werden. Weiss Jemand, ob und ggf. wie das möglich ist?

Gruss

Jan

  1. Hallo

    Dein Test ist sowieso nicht ganz sauber: Steht im xml nämlich mailto:ich@du.de dann wird dein concat() daraus, wenns denn funktioniert, mailto:mailto:ich@du.de generieren....

    Falls Du das XML aus HTML-Formularen generierst, ist das abfangen dieses Fehlers denke ich am einfachsten, wenn Du das Formular vor dem Abschicken mittels JS validierst.

    gruss
    gant

    1. Hast du für so eine Formatüberprüfung via JS ein beispiel?

      1. Hast du für so eine Formatüberprüfung via JS ein beispiel?

        wir haben das so gelöst:

        function validateProcess() {
         var m = document.mform;
         if(valid("N","_dokument_dokumenttitel")) {
          msg("Geben Sie bitte einen Dokumenttitel an.");
          m._dokument_dokumenttitel.focus();
          return false;
            }

        if(valid("N","_dokument_autor_vorname") && !(m._dokument_dokumentkategorie.options[2].selected || m._dokument_dokumentkategorie.options[1].selected)) {
          msg("Geben Sie bitte den Vornamen des Autors an.");
          m._dokument_autor_vorname.focus();
          return false;
         }

        if((m._dokument_dokumentkategorie.options[2].selected) && m._dokument_autor_vorname.value != "") {
          msg("Wenn Sie als Dokumentkategorie 'Zeitschrift' gewählt haben, muss das Feld 'Autor / Vorname' leer bleiben.");
          m._dokument_autor_vorname.focus();
          m._dokument_autor_vorname.value = "";
          return false;
         }

        if(m._dokument_autor_nachname.value == "" && m._dokument_dokumentkategorie.options[2].selected)  {
          msg("Geben Sie bitte den Titel der Zeitschrift im Feld 'Autor / Nachname' an.");
          m._dokument_autor_nachname.focus();
          return false;
            }

        if(m._dokument_autor_nachname.value == "" && !m._dokument_dokumentkategorie.options[2].selected)  {
          msg("Geben Sie bitte den Nachnamen des Autors an.");
          m._dokument_autor_nachname.focus();
          return false;
            }

        if(m._dokument_schluesseldokument[0].checked && m._dokument_reviewer.value == "") {
          msg("Wenn Sie Schlüsseldokument 'ja' wählen, müssen Sie einen Reviewer angeben.");
          m._dokument_reviewer.focus();
          return false;
         }

        if(m._dokument_schluesseldokument[1].checked && m._dokument_reviewer.value != "") {
          msg("Wenn Sie Schlüsseldokument 'nein' wählen, können Sie keinen Reviewer angeben.");
          m._dokument_reviewer.value= "";
          return false;
         }

        if(!m._dokument_dokumentkategorie.options[0].selected && (m._dokument_projektnummer.value != "" || m._dokument_projektname.value != "")) {
          msg("Wenn Sie als Dokumentkategorie nicht Projektdokument gewählt haben, müssen die Felder Projektnummer und Projektname leer bleiben.");
          m._dokument_projektnummer.value = "";
          m._dokument_projektname.value = "";
          return false;
         }

        if(m._dokument_dokumentkategorie.options[0].selected && m._dokument_projektnummer.value == "") {
          m._dokument_projektnummer.blur();
          msg("Geben Sie bitte eine Projektnummer ein.");
          m._dokument_projektnummer.focus();
          return false;
         }

        if(m._dokument_dokumentkategorie.options[0].selected && m._dokument_projektname.value == "") {
          m._dokument_projektname.blur();
          msg("Geben Sie bitte einen Projektnamen ein.");
          m._dokument_projektname.focus();
          return false;
         }

        if(m._dokument_dokumentkategorie.options[0].selected) {
          var pn = m._dokument_projektnummer.value;
          var r1 = /[XPUBKAEIN]\d\d\d\d/i;
          var erg = pn.match(r1);
          if(pn != erg || m._dokument_projektnummer.value.length > 5) {
           m._dokument_projektnummer.blur();
           msg("Die von Ihnen angegebene Projektnummer entspricht nicht dem Standardformat 'x1234'.");
           m._dokument_projektnummer.focus();
           m._dokument_projektnummer.select();
           return false;
          }
         }
         msg("Validierung erfolgreich");
         return true;
        }

        die felder werden nach diversen kriterien validiert...

        hoffe, es hilft.

        Grüsse

  2. Hallo Jan!

    Ich weiß nicht, ob das (noch) möglich ist -  aber ich würde einfach die Selektion bereits in der xml-Datei treffen. Warum alles als "href" übergeben und dann mühsam nach dem Klammeraffen suchen.

    Ich würde die Attribute "link" und "mail" einführen - damit sollte es eigentlich einfach sein.

    <xsl:template match="A">
     xsl:choose
      <xsl:when test="@mail">
       <a>
        <xsl:attribute name="href">
         mailto:<xsl:value-of select="@mail" />
        </xsl:attribute>
        <xsl:apply-templates />
       </a>
      </xsl:when>
      xsl:otherwise
       <a href="{@href}">
        <xsl:apply-templates />
       </a>
      </xsl:otherwise>
     </xsl:choose>
    </xsl:template>

    Wenns so nicht geht - nochmal posten.

    mfg

    norbert =:-)

    Hallo zusammen,

    ich möchte in meinem xsl-stylesheet bestimmte Formate sicherstellen. Beispielsweise soll die Verlinkung von Email-Adressen auch korrekterweise mit dem "mailto:"-Befehl beginnen, selbst wenn der Eintrag im xml-file nicht korrekt bzw. unvollständig ist. Ich habe mir überlegt, dass es am sinnvollsten ist, am Ende des xsl-stylesheets folgenden Eintrag einzufügen:

    <xsl:template match="A">
      xsl:choose
       <xsl:when test="contains(@href,'@')">
        <a>
         <xsl:attribute name="href">
          <xsl:value-of select="concat('mailto:',@href)" />
         </xsl:attribute>
         <xsl:apply-templates />
        </a>
       </xsl:when>
       xsl:otherwise
        <a href="{@href}">
         <xsl:apply-templates />
        </a>
       </xsl:otherwise>
      </xsl:choose>
     </xsl:template>

    Aufgrund der Tatsache, dass die <A>-Tags, die ursprünglich im xml-file stehen, gross geschrieben werden, und die neuen zu setzenden Tags entsprechend klein geschrieben werden, kann ich bereits am html-Output erkennen, dass diese Format-Überprüfung nicht stattfindet. Der nicht geänderte Inhalt des Attributes href zeigt dies natürlich auch. Es muss also schon an der Adressierung der Tags liegen. Ich würde die Formatierung allerdeings gerne so gestalten, dass jegliche <A>-Tags, egal in welchem Unterknoten sie sich befinden, entsprechend formatiert werden. Weiss Jemand, ob und ggf. wie das möglich ist?

    Gruss

    Jan

  3. Hallo,

    Es muss also schon an der Adressierung der Tags liegen. Ich würde die Formatierung allerdeings gerne so gestalten, dass jegliche <A>-Tags, egal in welchem Unterknoten sie sich befinden, entsprechend formatiert werden. Weiss Jemand, ob und ggf. wie das möglich ist?

    Ob der Template für A angwendet wird, hängt nicht vom Template selber ab, sonder davon wie, wann und ob überhapt dieser Template aufgerufen wird.
    Wenn der Template nicht angewendt wird, düfte an sich auch kein <A> in das Ergebnisdokument gelangen, es seit denn du arbeitest irgendwo mit xsl:copy-of.

    Auch wenn dein Template nicht falsch ist, würde ich es eher so machen:
    <xsl:template match="A">
      <a>
        xsl:choose
          <xsl:when test="contains(@href,'@')">
            <xsl:attribute name="href">
              <xsl:value-of select="concat('mailto:',@href)" />
            </xsl:attribute>
          </xsl:when>
          xsl:otherwise
            <xsl:attribute name="href">
              <xsl:value-of select="@href" />
            </xsl:attribute>
         </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates />
      </a>
    </xsl:template>

    schließlich geht es nur um die Unterschiedung beim href-Attribut.

    Grüße
    Thomas