sydys: template when test

Hallo!

Ich habe eine Zugriffsfrage zu XSL, hoffe jemand kann weiterhelfen.
Ich verarbeite mit einem Stylesheet XML Daten, die wie folgt aussehen:

Es gibt Datensätze vom Typ "h" und Typ "u"

<root>
<datensatz typ="h">
<feld nr="1">111</feld>
...
</datensatz>
...
<datensatz typ="u">
<feld nr="1">222</feld>
<feld nr="2">111</feld>
<feld nr="3">schlüsselwort</feld>
</datensatz>
...
</root>

Ich möchte nun den Datensatz vom Typ "h" nur dann verarbeiten, wenn dessen id=111 Inhalt im Feld nr "2" eines Datensatzes vom Typ "u" ist UND gleichzeitig DIESER Datensatz "u" im Feld nr "3" das Schlüsselwort=$schlüsselwort enthält.
Wie kann ich dies als Frage formulieren, wenn ich mich innerhalb des Stylesheets im Template zu Datensatz Typ "h" befinde? Realisiere ich dies mit einem doppelten Punkt?

<xsl:template match="datensatz[(@typ='h')]">
    xsl:choose
      <xsl:when test="//datensatz[(@typ='u')]/feld[@nr='2'] =feld[(@nr='1')] and //datensatz[(@typ='u')]/feld[@nr='2']=feld[(@nr='1')]/../feld[@nr='3']=$schlüsselwort">

....

Hoffe, das ist nicht zuviel Wirrwarr ;-)

Vielen Dank + Grüße !!!
Frank

  1. Vielleicht solltest du nochmal über deine Struktur nachdenken.

    Variante1:

    <xsl:template match="datensatz[@typ='u']">  
      <xsl:if test="feld[@nr='3']='xxx'">  
        <xsl:apply-templates select="/root/datensatz[@typ='h']">  
          <xsl:with-param name="h-id">  
            <xsl:value-of select="feld[@nr='2']"/>  
          </xsl:with-param>  
        </xsl:apply-templates>  
      </xsl:if>  
    </xsl:template>  
      
    <xsl:template match="/root/datensatz[@typ='h']">  
      <xsl:param name="h-id" />  
      
      <xsl:if test="feld[@nr='1']=$h-id">  
        found  
      </xsl:if>  
    </xsl:template>
    

    Variante2:

    <xsl:template match="datensatz[@typ='h']">  
      <xsl:variable name="h-id" select="feld[@nr='1']"/>  
      
      <xsl:for-each select="/root/datensatz[@typ='u']">  
        <xsl:if test="feld[@nr='2']=$h-id">  
          <xsl:if test="feld[@nr='3']='xxx'">  
            found  
          </xsl:if>  
      </xsl:if>  
      </xsl:for-each>  
    </xsl:template>
    
    1. Variante2:
      <xsl:template match="datensatz[@typ='h']">
        <xsl:variable name="h-id" select="feld[@nr='1']"/>

      <xsl:for-each select="/root/datensatz[@typ='u']">
          <xsl:if test="feld[@nr='2']=$h-id">
            <xsl:if test="feld[@nr='3']='xxx'">
              found
            </xsl:if>
        </xsl:if>
        </xsl:for-each>
      </xsl:template>[/code]

      Klasse - Tausend Dank, Variante2 hilft mir weiter.

      Allerdings stehe ich nun vor dem nächsten Problem. Nachdem ich mich nun im Template match="datensatz[@typ='h'] befinde UND nun weiß, dass dies der richtige Datensatz ist (-->"found"), möchte ich diesen nun bearbeiten. Durch die for-each-Scleife befinde ich mich jetzt aber nicht mehr im Kontext von datensatz[@typ='h'].
      Wie kann ich dort wieder hinkommen???

      Viele Grüße
      Frank

      1. Wie kann ich dort wieder hinkommen???

        Variante 1