dynamisch iterieren
sabac
- xsl
0 Christian Seiler0 ThomasM0 sabac
hallo
ich habe eine xml struktur die zb. so aussieht:
<PropertyText_nr1>prop1</PropertyText_nr1>
<PropertyText_nr0>prop2</PropertyText_nr0>
dazu das nötige template:
<xsl:template name="recurse_property">
<xsl:param name="num" />
<xsl:param name="maxcount" />
<xsl:if test="$num <= $maxcount">
<xsl:param name="proptext">concat('PropertyText_nr', $num)</xsl:param>
<fo:block text-align="left" font-size="9pt">
<xsl:value-of select="$proptext"/>
</fo:block>
<xsl:call-template name="recurse_property">
<xsl:with-param name="num">
<xsl:value-of select="$num + 1"/>
</xsl:with-param>
<xsl:with-param name="maxcount">
<xsl:value-of select="$maxcount"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
mein problem ist jetzt, wieso sieht es den parameter $proptext nicht als node name an? <xsl:value-of select="$proptext"/> gibt dann den string 'PropertyText_nr0' aus. wenn ich aber direkt schreibe <xsl:value-of select="PropertyText_nr0"/> gibt es den wert von PropertyText aus.
gibt es sonst eine möglichkeit die werte auszugeben?
danke im voraus
Hallo,
ich habe eine xml struktur die zb. so aussieht:
<PropertyText_nr1>prop1</PropertyText_nr1>
<PropertyText_nr0>prop2</PropertyText_nr0>
Uh, das ist XML-Design-mäßig eines der idiotischten Dinge, die man tun kann... Erinnert mich irgendwie an http://thedailywtf.com/Articles/XML-Abuse.aspx...
Wenn es auch nur *IRGENDWIE* geht: Ändere die XML-Struktur. Du wirst damit nicht glücklich werden. Besser wäre z.B. <PropertyText nr="0"> oder so...
<xsl:param name="proptext">concat('PropertyText_nr', $num)</xsl:param>
Ok, Du scheinst einige XSLT-Details noch nicht so ganz verinnerlicht zu haben:
1. xsl:param/ willst Du nur, wenn Du den Inhalt bei call-template auch mit with-param überschreiben können willst. Sonst willst Du xsl:variable/ - ansprechen kannst Du sie auf gleiche Weise mit $name.
2. concat() ist eine XPath-Funktion, d.h. Du müsstest statt Elementinhalt das ins select-Attribut schreiben, z.B. so:
<xsl:variable name="proptext" select="concat('PropertyText_nr', $num)" />
Sonst steht nämlich einfach nur *direkt* der Text (!) »concat('PropertyText_nr', $num)« in der Variable.
3. Selbst dann selektierst Du nur den Text "PropertyText_nr0", nicht aber den zugehörigen Knoten. Wenn Du den selektieren willst, musst Du mit Qualifiern arbeiten:
<xsl:variable name="proptext" select="*[local-name() = concat('PropertyText_nr', $num)]" />
Damit sollte es dann auch funktionieren.
Viele Grüße,
Christian
Hallo sabac,
mein problem ist jetzt, wieso sieht es den parameter $proptext nicht als node name an? <xsl:value-of select="$proptext"/> gibt dann den string 'PropertyText_nr0' aus. wenn ich aber direkt schreibe <xsl:value-of select="PropertyText_nr0"/> gibt es den wert von PropertyText aus.
gibt es sonst eine möglichkeit die werte auszugeben?
In $proptext steht ja auch eine Zeichenkette und kein XPath-Ausdruck. XPath-Ausdrücke lassen sich z. B. so dynamisch aufbauen:
child::node()[local-name()=$proptext]
Grüße,
Thomas
vielen dank euch zwei!
funktioniert einwandfrei!