Announcement

Collapse
No announcement yet.

XSL Attribut anhand eines anderen Attributs finden

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

  • XSL Attribut anhand eines anderen Attributs finden

    Hallo Forum,

    frohes neues Jahr Euch allen. Ich stehe gerade vor einem merkwürdigen Problem. Ich verarbeite eine XML Dokument mit einem XSL-Stylesheet und rufe darin während der Verarbeitung ein weiteres XML-Dokument auf, auf welches Attribute aus dem ersten XML verweisen. Ich setze dies zweifach ein, aber leider funktioniert es nur im ersten Fall.

    Hier einmal der relevante Auszug aus dem Haupt-XML:
    Code:
    <idPkg:Spread>
    	<Spread>
                    <Rectangle FillColor="Color/ucc" />
            </Spread>
    </idPkg:Spread>
    In der includierten XML steht dann bspw. folgendes:
    Code:
    <Color Self="Color/ucc" Model="Process" Space="CMYK" ColorValue="0 0 0 0" /><!-- hier ist die @FillColor von oben als CMYK definiert -->
    <Color Self="Color/u105" Model="Process" Space="CMYK" ColorValue="0 0 0 85" />
    <Color Self="Color/u10a" Model="Process" Space="RGB" ColorValue="255 79 13" />
    <Color Self="Color/u10b" Model="Process" Space="CMYK" ColorValue="0 0 45 12" />
    Ich will also in dem Fall das eine Farbe im Haupt-XML gewählt wird, auf die andere XML zugreifen und die Farbwerte in CMYK oder RGB abgreifen. Dazu steht mir XSL 1.0 (bei PHP) zur Verfügung:

    Code:
    <xsl:variable name="colorValuesFile">
            <xsl:text>../idml/</xsl:text>
            <xsl:value-of select="$idmlBaseID"/>
            <xsl:text>/idml/Resources/Graphic.xml</xsl:text>
    </xsl:variable>
    
    <xsl:variable name="fillColorName">
            <xsl:value-of select="@FillColor" />
    </xsl:variable>
                                <xsl:variable name="fillColor">
                                    <xsl:choose>                        
                                        <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@Space = 'CMYK'">
                                            <red>
                                                <xsl:value-of select="format-number(( 1 - ( (substring-before(substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'C='),' ') div 100) * ( 1 - (substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) + (substring-after($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </red>
                                            <green>
                                                <xsl:value-of select="format-number(( 1 - ( (substring-before(substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'M='),' ') div 100) * ( 1 - (substring-after($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) + (substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </green>
                                            <blue>
                                                <xsl:value-of select="format-number(( 1 - ( (substring-before(substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'Y='),' ') div 100) * ( 1 - (substring-after($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) + (substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'K=') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </blue>
                                        </xsl:when>
                                        <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@Space = 'RGB'">
                                            <red>
                                                <xsl:value-of select="substring-before(substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'R='),' ')"/>
                                            </red>
                                            <green>
                                                <xsl:value-of select="substring-before(substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'G='),' ')"/>
                                            </green>
                                            <blue>
                                                <xsl:value-of select="substring-after(document($colorValuesFile)/idPkg:Graphic/Color[Self='$fillColorName']/@ColorValue,'B=')"/>
                                            </blue>
                                        </xsl:when>
                                    </xsl:choose>
                                </xsl:variable>
    Für CMYK werden die Werte dann in RGB umgerechnet, für RGB einfach ausgelesen. Komischerweise verarbeitet XSLT das ChooseWhen noch richtig, erst bei value-of steigt das Skript aus???

    Danke für jede Hilfe.
    Gruss
    Dom

  • #2
    Hallo nochmal,

    habs gelöst. Irgendwie hab ich übersehen, dass ich noch aus einer alten Version die Bezeichnet C=, M=, Y= und K= drin hatte. Die gibt es in der zweiten XML Datei gar nicht mehr, so kann ich per str-tokenize arbeiten.

    Code:
    <xsl:variable name="fillColor">
                                    <xsl:choose>                        
                                        <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@Space = 'CMYK'">
                                            <red>
                                                <xsl:value-of select="format-number(( 1 - ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=1],' ') div 100) * ( 1 - (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </red>
                                            <green>
                                                <xsl:value-of select="format-number(( 1 - ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=2],' ') div 100) * ( 1 - (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </green>
                                            <blue>
                                                <xsl:value-of select="format-number(( 1 - ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=3],' ') div 100) * ( 1 - (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=4],' ') div 100) ) ) * 255, '#', 'rgb')"/>
                                            </blue>
                                        </xsl:when>
                                        <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@Space = 'RGB'">
                                            <red>
                                                <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=1],' ')"/>
                                            </red>
                                            <green>
                                                <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=2],' ')"/>
                                            </green>
                                            <blue>
                                                <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self='$fillColorName']/@ColorValue[position()=3],' ')"/>
                                            </blue>
                                        </xsl:when>
                                    </xsl:choose>
                                </xsl:variable>
    Danke trotzdem und Gruss
    Dom

    Comment


    • #3
      Hallo nochmal,

      ich muss doch noch mal nachhaken, denn o.a. Code ist falsch, da ich nicht die position, sondern die number ansprechen muss. Folgender Code wäre also richtiger, wenn man davon absieht das alle Werte für RGB leer sind. Das Script bricht aber nicht mehr ab. Die Berechnung von RGB aus CMYK ist auch etwas vereinfachter:

      Code:
      <xsl:variable name="fillColor">
      <xsl:choose>        
          <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@Space = 'CMYK'">
              <red>
                  <xsl:value-of select="format-number( 255 - ( ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(1)]) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(4)])) * 2.55), '#', 'rgb')"/>
              </red>
              <green>
                  <xsl:value-of select="format-number( 255 - ( ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(2)]) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(4)])) * 2.55), '#', 'rgb')"/>
              </green>
              <blue>
                  <xsl:value-of select="format-number( 255 - ( ( (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(3)]) + (str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(4)])) * 2.55), '#', 'rgb')"/>
              </blue>
          </xsl:when>
          <xsl:when test="document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@Space = 'RGB'">
              <red>
                  <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(1)]"/>
              </red>
              <green>
                  <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(2)]"/>
              </green>
              <blue>
                  <xsl:value-of select="str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(3)]"/>
              </blue>
          </xsl:when>
      </xsl:choose>
      </xsl:variable>
      Also mein aktuelles Problem ist, das Ergebnis ist leer (nicht 0 oder ähnliches). Danke für jede Hilfe.

      Gruss
      Dom

      Comment


      • #4
        Moin,

        jetzt hab ich es herausgefunden, hab das @ vergessen:

        Code:
        str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[Self=$fillColorName]/@ColorValue,' ')[number(2)]
        
        <!--muss heißen-->
        
        str:tokenize(document($colorValuesFile)/idPkg:Graphic/Color[@Self=$fillColorName]/@ColorValue,' ')[number(2)]
        mit diesem Statement hole ich mir also das ColorValue Attribut zum Schwester Attribut Self und benutze den 2ten Wert aus z.B: 0 123 456 789. Vielleicht hilfts jemandem.

        Grüsse
        Dom

        Comment

        Working...
        X