Frage zu for-each und document()
hh
- xsl
0 Thomas J.S.0 hh
Hi,
welche Möglichkeiten gibt es, um aus einer
<xsl:for-each select="document(........)/......">
wieder "rauszukommen" und den Wert mitnehmen. Also beispielhaft ich ermittle die ausgabe von bestimmten elementen im erstenfile.xml über eine abfrage von attributwerten in bestimmter reihenfolge aus einem anderen file (zweitesfile.xml)
<xsl:for-each selet="document(zweitesfile.xml)/root/liste>
<xsl:value-of select="@attribute1"/>
<xsl:value-of select="@attribute2"/>
<xsl:value-of select="@attributeID"/>
</xsl:for-each>
Jetzt werden mir drei Werte für jeden Durchgang angegeben, ich würde aber gerne noch einen vierten hinzufügen, welcher sich in abhängigkeit von dem attributewert aus dem eigentlich zu parsenden dokument ergibt.
<xsl:for-each selet="document(zweitesfile.xml)/root/liste>
<xsl:value-of select="@attribute1"/>
<xsl:value-of select="@attribute2"/>
<xsl:value-of select="@attributeID"/>
<xsl:value-of select="wert[@wertID=@attributeID]"/>
</xsl:for-each>
Mir ist klar, dass der vierte Wert so nicht abgefragt werden kann, da sich die for-each ja auf den knoten document(.... bezieht. Wie kann man es aber schaffen?
erstexmlfile.xml
<root>
<wert @wertID="xyv">4564</wert>
<wert @wertID="xrt">4234</wert>
<wert @wertID="ztyv">6764</wert>
.
.
.
.
</root>
Gruß, Holger
Hallo,
welche Möglichkeiten gibt es, um aus einer
<xsl:for-each select="document(........)/......">
wieder "rauszukommen" und den Wert mitnehmen.
Keine (um rauszukommen und einen Wert mitzunehmen).
Also beispielhaft ich ermittle die ausgabe von bestimmten elementen im erstenfile.xml über eine abfrage von attributwerten in bestimmter reihenfolge aus einem anderen file (zweitesfile.xml)
<xsl:for-each selet="document(zweitesfile.xml)/root/liste>
<xsl:value-of select="@attribute1"/>
<xsl:value-of select="@attribute2"/>
<xsl:value-of select="@attributeID"/>
</xsl:for-each>
Jetzt werden mir drei Werte für jeden Durchgang angegeben, ich würde aber gerne noch einen vierten hinzufügen, welcher sich in abhängigkeit von dem attributewert aus dem eigentlich zu parsenden dokument ergibt.
Eine Möglichkeit wäre z.B.:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="firstRoot" select="/" />
<xsl:for-each selet="document(zweitesfile.xml)/root/liste>
<xsl:variable name="myVar" select="@attributeID"/>
<xsl:value-of select="@attribute1"/>
<xsl:value-of select="@attribute2"/>
<xsl:value-of select="@attributeID"/><xsl:value-of select="wert[@wertID=@attributeID]"/>
<xsl:for-each selet="$firstRoot/root/wert[@wertID = $myVar]>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
Mir ist klar, dass der vierte Wert so nicht abgefragt werden kann, da sich die for-each ja auf den knoten document(.... bezieht. Wie kann man es aber schaffen?
Grüße
Thomas
Hallo Thomas,
danke für die Antwort
Keine (um rauszukommen und einen Wert mitzunehmen).
»»
Das sind mir die liebsten Antworten, dann weiss man immer, woran man ist. Danke auch für deinen Vorschlag, werde ihn mal ausprobieren. Habe es dann gestern abend mit einem rekursiven Template geschafft, bin aber nicht ganz zufrieden mit der Performance.
Da wir aber gerade bei dem Problem der Wertübergabe sind tut sich bei mir eine neue Frage auf bei XML Schema - kann man einem Attribut der xml Datei als zulässigen Wert den INhalt einer ID im Schema zuweisen?
folgende Beispiel XML
<root>
<test elementRef="hosen"/>
<test elementRef="schuhe"/>
<test elementRef="schuhe"/>
<test elementRef="jacke"/>
.
.
.
<hosen>Levos</hosen>
<hosen>Wrungler</hosen>
<schuhe>Pima</schuhe
</root>
Das verbundene Schema sieht etwa so aus schema.xsd
<xsi:element id="hosen" name="hosen" type="xsi:string"/>
<xsi:element id="schuhe" name="schuhe" type="xsi:string"/>
<xsi:element id="jacke" name="jacke" type="xsi:string"/>
<xsi:element name="test">
xsi:complexTyp
.
.
.
<xsi:attribute name="elementRef" type="????"/>
</xsi:complexTyp>
</xsi:element>
Kann man irgendwie nun dem Attribute elementRef zuweisen, dass es nur ID's, die im verbundenen schema vorhanden sind enthalten darf?? Wenn ich
<xsi:attribute name="elementRef" type="IDREF"/> nehme, dann dürfte ja ein fehler kommen, da ich die ID ja nicht in der XML Datei angegeben habe. .
Grüße
Holger
Hallo,
Kann man irgendwie nun dem Attribute elementRef zuweisen, dass es nur ID's, die im verbundenen schema vorhanden sind enthalten darf??
Nein. Wie es möglich wäre (key oder unique) muss ich mir auch erst überlegen.
Wenn ich <xsi:attribute name="elementRef" type="IDREF"/> nehme, dann dürfte ja ein fehler kommen, da ich die ID ja nicht in der XML Datei angegeben habe. .
Ja, so ist es.
Grüße
Thomas