2009-07-24 20 views
0

Ich habe ein Problem mit XSL-Variablen. Ich weiß, dass einmal der Wert der Variablen nicht geändert werden kann.Wert der Variablen in xsl ändern

Aber ich bin mit einem ziemlich seltsamen Problem konfrontiert und ich kann möglicherweise nicht die XML-Ausgabe ändern, stattdessen herausfinden, ob es mit XSL selbst möglich ist.

Ich benutze xsl: for-each, um einige Daten im XML zu durchlaufen.

Die Daten können von drei Arten durchgeschleift werden, sagen Typ1, Typ2 und Typ3

Wenn es von Typ1 ist, ich bin eine Vorlage ruft diese Daten zu verarbeiten. In der Vorlage zeige ich eine Kopfzeile an. Ich muss diesen Header zum allerersten Mal drucken, wenn ich nur auf diese Type1-Daten stoße. Danach muss ich das nicht mehr anzeigen.

Ich könnte einen Parameter mit der Call-Vorlage übergeben und setzen/deaktivieren, um festzustellen, ob ich den Header-Text drucken muss. Aber wie ich es verstehe, ist der Variablenstatus als Formatierungssprache nicht erhalten.

Können Sie bitte Ihre wertvollen Vorschläge zur Implementierung (möglicherweise ohne XML-Änderungen) zur Verfügung stellen?

Edit:

Der Test wird für die XML-Ausgabe von Patrice erwähnt arbeiten. Aber mein XML ist anders.

<doc> 
<item>foobar</item> 
<item>foo</item> 
<item>bar</item> 
<item>baz</item> 
<item>foo</item> 
<item>bar</item> 
</doc> 

Aus diesem XML muss ich eine Kopfzeile anzeigen, wenn sie das erste Mal auf "foo" stößt. Die Reihenfolge der Artikel könnte auch alles sein. Ich kann nicht genau vorhersagen, wann 'foo' im XML erscheinen wird.

Können Sie bitte Vorschläge machen?

+0

Für das erste Element, dessen Inhalt „foo“, ersetzen Bitte senden Sie einige Ihrer Code, so können wir helfen. –

Antwort

3

Sie können einen richtigen Selektor dafür verwenden (wäre einfacher mit einigen tatsächlichen Code von Ihnen).

Beispiel mit diesem Eingang:

<doc> 
    <item>foo</item> 
    <item>bar</item> 
</doc> 

können Sie diese XSLT verwenden:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
<xsl:output method='html' version='1.0' encoding='utf-8' indent='yes'/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/doc/item" /> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:if test="not(preceding-sibling::item)"> 
      <h1>First</h1> 
     </xsl:if> 
     <p><xsl:apply-templates /></p> 
    </xsl:template> 

</xsl:stylesheet> 

Und Sie werden diese Ausgabe erhalten:

<h1>First</h1> 
<p>foo</p> 
<p>bar</p> 

Der Schlüssel ist der Test

<xsl:if test="not(preceding-sibling::item)"> 

Sie können auch, dass

<xsl:if test="not(preceding::item)"> 

je nach Dokumentstruktur ändern.

Weitere Informationen finden Sie unter XPath axes.

+0

Ich habe auch nicht (position() = 1) mit etwas Erfolg benutzt, aber ich mag deine Lösung besser, da es den Test besser erklärt. – Ishmael

+0

+1 wenn auf vorhergehende Geschwister ist, was ich hier für die eine oder andere Weise gehen würde – annakata

0

Sie müssen wahrscheinlich nur ein Prädikat hinzufügen, aber wieder, ohne ein konkretes Beispiel für Ihre Eingabe und wenig Details über die erwartete Ausgabe, ist es schwer zu sagen.Patrice-Tag mit

<xsl:if test=".='foo' and not(preceding-sibling::item[.='foo'])"> 
+0

Danke für Ihre Hilfe, Josh. Die erwartete Ausgabe würde

Nur das erste 'foo' Element erfordert einen Header

foobar

Kopf

foo

bar

baz

foo

bar betragen. – jobinbasani

Verwandte Themen