template when test
sydys
- xsl
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
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>
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
Wie kann ich dort wieder hinkommen???
Variante 1