juls_pro_37: XSLT 1.0 nummerierung

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

akzeptierte Antworten

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