Kathrin: Formate definieren abhängig von mehreren Attributen

Hallo,

ich würde gerne zur besseren Lesbarkeit und Übersichtlichkeit unterhalb von <style type="text/css"> Formate definieren. In Selfhtml habe ich gelesen, dass man dies auch abhängig von Attributen machen kann, zB so

*[align=center]{background-color:#aaaaaa;}

Ich würde aber gerne nur wenn 2 Attribute einen bestimmten Wert haben, ein Format definieren. Ich hatte es so probiert

*[change=add][mark=1]{background:#aaaaaa;}
oder
*[change=add]and[mark=1]{background:#aaaaaa;}
aber leider funktioniert es nicht.

Kann mir jmd einen Tipp geben, was ich falsch mache bzw wie man das machen kann? Habe bisher auch nichts im Netz gefunden, was mir weiterhelfen könnte.

VIelen Dank im Voraus
Viele Grüße
Kathrin

  1. @@Kathrin:

    nuqneH

    Ich würde aber gerne nur wenn 2 Attribute einen bestimmten Wert haben, ein Format definieren.

    Welche Elemente dürfen denn @change- und @mark-Attribute haben? Um Daten in Attributen unterzubringen, bietet HTML5 @data-*-Attribute. Vielleich möchtest du @data-change und @data-mark verwenden?

    *[change=add][mark=1]{background:#aaaaaa;}
    oder
    *[change=add]and[mark=1]{background:#aaaaaa;}
    aber leider funktioniert es nicht.

    Die zweite Syntax entspringt deiner Phantasie. Die erste sieht fast gut aus.

    Das Problem liegt hier: “Attribute values must be identifiers or strings.” [CSS21 §5.8.1]

    Wie ein String auszusehen hat, ist in [§4.3.7] erklärt: “Strings can either be written with double quotes or with single quotes.”

    Wie ein Identifier auszusehen hat, ist in [§4.3.1] erklärt. Beachte: “they cannot start with a digit”.

    Kann mir jmd einen Tipp geben, was ich falsch mache bzw wie man das machen kann?

    "1" darf kein Identifier sein, sondern muss ein String sein. Allgemein ist es ratsam, Attributwerte immer als String anzugeben, dann spart man sich solche Überlegungen.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. Die zweite Syntax entspringt deiner Phantasie. Die erste sieht fast gut aus.

      Stimmt - die zweite Syntax hatte ich mir selbst überlegt, die erste ist mehr so ne Vermutung gewesen, weil ich die Beschreibung immer nur für ein Element gesehen habe. Habe festgestellt, dass es gar nicht unbedingt an den zwei Attributen liegt, dass es nicht funktioniert, sondern dass es generell nicht geht.

      Das Problem ist wir haben XML-Dateien, die wir mit einer XSL-Transformation anzeigen. Das Attribute change kommt bei paragraph vor und wird als p umgesetzt - ich kopiere mal einen Teil des scripts hierrein:

      <?xml version="1.0" encoding="iso-8859-1"?>  
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
        
      <xsl:output  
          method="html"  
          doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"  
      	media-type="text/html"  
          encoding="ISO-8859-1"  
          omit-xml-declaration="yes"  
          version="1.0" />  
        <xsl:output method="xml" version="1.0" encoding="iso-8859-1" indent="yes" />  
        
        <xsl:template match="node()">  
          <xsl:value-of select="."/>  
        </xsl:template>  
        
        <xsl:template match="/">  
          <xsl:apply-templates select="*"/>  
        </xsl:template>  
        
        <xsl:template match="dmodule">  
          <html>  
            <head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>  
              <title><xsl:value-of select="normalize-space(//name)"/></title>  
              <style type="text/css">  
                @media print{  
                }  
      	  *[change=add]{  
      	    background-color:#aaffaa;border-right:4px solid black;margin-right:3px;  
                }  
              </style>  
            </head>  
            <body bgcolor="#ffffff" style="font-family:Arial Unicode MS;">  
              <xsl:apply-templates select="cont"/>  
            </body>  
          </html>  
        </xsl:template>  
        
        <xsl:template match="cont|CONT">  
          <xsl:apply-templates select="descr|DESCR"/>  
        </xsl:template>  
        
        <xsl:template match="descr|DESCR">  
          <xsl:apply-templates select="*"/>  
        </xsl:template>  
        
        <xsl:template match="paragraph">  
          <p><!--  
      	  <xsl:attribute name="style">margin-top:6px;margin-bottom:2px;<xsl:choose>  
              <xsl:when test="@change='add' and @mark='1'">background-color:#aaffaa;border-right:4px solid black;margin-right:3px;</xsl:when>  
              <xsl:when test="@change='delete' and @mark='1'">background-color:#aaffaa; text-decoration:line-through;border-right:4px solid black;margin-right:3px;</xsl:when>  
            </xsl:choose></xsl:attribute>-->  
            <xsl:if test="@id"><xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute></xsl:if>  
            <xsl:apply-templates select="*|text()"/>  
          </paragraph>  
        </xsl:template>
      

      Ich habe die Kommentarzeichen unterhalb von paragraph extra mal dringelassen, dass man sieht, wie es vorher umgesetzt war. Wie könnte man @change="add" und @mark="1" unterhalb von <style type="text/css"> umsetzen, so dass es funktioniert? Momentan funktioniert ja nicht mal @change="add", change und mark kommen nämlich bei vielen verschiedenen Elementen im XML vor.

      Ich hoffe, dass jemand mir einen Tipp geben kann.

      Vielen Dank im Voraus
      Viele Grüße
      Kathrin

      1. @@Kathrin:

        nuqneH

        Das Problem ist wir haben XML-Dateien, die wir mit einer XSL-Transformation anzeigen.

        Die XSL-Transformation will ich eigentlich gar nicht sehen, sondern nur deren Ergebnis, also das generierte HTML.

        Gibt es denn 'p'-Elemente, die sowohl @change- als auch @mark-Attribute haben? (Wie du die Attribute stattdessen nennen solltest, hatte ich dir gesagt.)

        Und dann sollte es auch mit dem CSS funktionieren, wenn du den gegebenen Hinweis berücksichtigst.

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
        1. @Gunnar:
          irgendwie hatte ich schon was geschrieben und es geschafft dass es jetzt weg ist ;-)

          Die XSL-Transformation will ich eigentlich gar nicht sehen, sondern nur deren Ergebnis, also das generierte HTML.

          Gibt es denn 'p'-Elemente, die sowohl @change- als auch @mark-Attribute haben? (Wie du die Attribute stattdessen nennen solltest, hatte ich dir gesagt.)

          Also im XML haben wir die Attribute change und mark, die aber von der Struktur so vorgeschrieben sind und nicht umbenannt werden können. Bei P sind laut selfhtml diese Attributnamen, die du vorgeschrieben hattest, nicht erlaubt, wenn man sich an den Standard hält oder? Ich habe es halt jetzt so geändert, dass an den Stellen wo change und mark auftreten können, dieses hier verwendet habe:
          xsl:choose
                  <xsl:when test="@change='add' and @mark='1'"><xsl:attribute name="class">add</xsl:attribute></xsl:when>
                  <xsl:when test="@change='delete' and @mark='1'"><xsl:attribute name="class">delete</xsl:attribute></xsl:when>
                </xsl:choose> und oben bei <style type="text/css">*.add und *.delete aufgenommen habe. Ist zwar schade, weil man so wieder die Abfrage drin hat und ich gehofft hatte, dass es ohne dieses choose geht, aber besser wie vorher ist es schon, denn jetzt kann man an einer Stelle die Darstellung ändern und es ist für alle gültig.

          Vielen Dank für deine Hilfe bisher.
          LG Kathrin

          1. @@Kathrin:

            nuqneH

            Bei P sind laut selfhtml diese Attributnamen, die du vorgeschrieben hattest, nicht erlaubt, wenn man sich an den Standard hält oder?

            SELFHTML 8.1.2 ist älter als HTML5; kann demzufolge @data-*-Attribute noch gar nicht enthalten.

            <xsl:when test="@change='add' and @mark='1'"><xsl:attribute name="class">add</xsl:attribute></xsl:when>
                    <xsl:when test="@change='delete' and @mark='1'"><xsl:attribute name="class">delete</xsl:attribute></xsl:when>

            Dass es in HTML <http://de.selfhtml.org/html/text/logisch.htm#aenderungsmarkierung@title=spezielle Elemente für Hinzugefügtes und Entferntes> gibt, weißt du?

            Qapla'

            --
            Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
            (Mark Twain)
            1. @Gunnar:

              sorry dass ich jetzt erst schreibe. nochmal vielen lieben Dank für deine guten Tipps. Achso wir verwenden bisher aber Standard-HTML. Die Elemente für delete und add kannte ich nicht. Danke für den Tipp.

              LG Kathrin