sabac: dynamisch iterieren

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 &lt;= $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

  1. 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

  2. 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

  3. vielen dank euch zwei!

    funktioniert einwandfrei!