XSLT 1.0 nummerierung
juls_pro_37
- xml
- xsl
1 ThomasM
Hi,
was fehlt hier in meinem XSLT?
Ich habe einen Knoten (Item_001) welcher ohne "LineNum" ausgegeben wird, daher muss ich diesen fortlaufend berechen.
Sprich: Item/LineNum + counter
siehe Artikel 4, hier erhalte ich nicht die "LineNum" mit wer 4.
Bitte um Info, wenn genauere Details benötigt werden. Hoffe, dass mein Beispiel verständlich ist.
XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<OrderResponse>
<HeaderInformation>
<ConfirmDocNum>SO0001084-3</ConfirmDocNum>
</HeaderInformation>
<LineInformation>
<Item>
<LineNum>1</LineNum>
<Artikel>1</Artikel>
</Item>
<Item>
<LineNum>2</LineNum>
<Artikel>2</Artikel>
</Item>
<Item_001>
<Artikel>3</Artikel>
</Item_001>
<Item_001>
<Artikel>4</Artikel>
</Item_001>
</LineInformation>
</OrderResponse>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="Item_001">
<xsl:element name="ItemTest">
<!--create new node LineNum with counter for Item_001 -->
<LineNum>
<xsl:value-of select="count(//Item/LineNum)+1"/>
</LineNum>
<!--copy all other nodes-->
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<!-- delete empty nodes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(@*|*|comment()|processing-instruction()) and normalize-space()='']"/>
</xsl:stylesheet>
Ergebnis sollte so aussehen:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<OrderResponse>
<HeaderInformation>
<ConfirmDocNum>SO0001084-3</ConfirmDocNum>
</HeaderInformation>
<LineInformation>
<Item>
<LineNum>1</LineNum>
<Artikel>1</Artikel>
</Item>
<Item>
<LineNum>2</LineNum>
<Artikel>2</Artikel>
</Item>
<Item_001>
<LineNum>3</LineNum>
<Artikel>3</Artikel>
</Item_001>
<Item_001>
<LineNum>4</LineNum>
<Artikel>4</Artikel>
</Item_001>
</LineInformation>
</OrderResponse>
Danke & LG Julian
Hallo Julian,
was fehlt hier in meinem XSLT?
Die relevante Stelle sollte sein:
<LineNum>
<xsl:value-of select="count(//Item/LineNum) + count(preceding-sibling::Item_001) + 1"/>
</LineNum>
In der gezeigten Ausgabe soll es offenbar wieder Item_001-Elemente geben, erzeugt werden jedoch ItemTest-Elemente. Das passt nicht.
BTW: xsl:element wäre dann aber auch nicht nötig, da eine literale Ausgabe von <ItemTest>–</ItemTest> bereits zielführend ist. xsl:element ist sinnvoll, wenn dynamische Elementnamen generiert werden sollen.
Grüße,
Thomas