2017-12-13 6 views
0

Hallo, ich versuche, xslt zu schreiben, wo, wenn ähnliche Eingabe unten angegeben wird, ich eine gewünschte Ausgabe bekommen müsste. Wenn Sie beobachten, dass die Ausgabe eine ID hat, die auf dem Auftreten eines Elements in diesem XML basiert. Bis jetzt in meinem xslt tue ich es basierend auf der Position. aber es bricht und startet die Zählung für jeden von Input XML. Kann dies erreicht werden?Inkrementiere den Elementwert in der Ausgabe basierend auf dem Auftreten eines Elements in der Eingabe

Update:

Hinzufügen einige weitere Details zu dem Eingang. Wie Sie sehen habe ich unter Niveau und das sollte

XML-Input-

<lines> 
    <line> 
     <po-num>text1</ponum> 
     <accountings> 
      <accounting> 
       <account> 
        <seg1>value1</seg1> 
       </account> 
      </accounting> 
      <accounting> 
       <account> 
        <seg1>value2</seg1> 
       </account> 
      </accounting> 
     </accountings> 
    </line> 
    <line> 
     <po-num>text2</ponum> 
     <accountings> 
      <accounting> 
       <account> 
        <seg1>value3</seg1> 
       </account> 
      </accounting> 
     </accountings> 
    </line> 
    <line> 
     <po-num>text3</ponum> 
     <account> 
      <seg1>value4</seg1> 
     </account> 
    </line> 
</lines> 

gewünschte Ausgabe XML

<Item> 
    <id>1</id> 
    <po-num>text1</ponum> 
    <seg>value1</seg> 
</Item> 
<Item> 
    <id>2</id> 
    <po-num>text1</ponum> 
    <seg>value2</seg> 
</Item> 
<Item> 
    <id>3</id> 
    <po-num>text2</ponum> 
    <seg>value3</seg> 
</Item> 
<Item> 
    <id>4</id> 
    <po-num>text3</ponum> 
    <seg>value4</seg> 
</Item> 

XSLT ich auf alle seine jeweiligen Daten ausgefüllt werden verwende den von Rupesh bereitgestellten xslt.

<?xml version="2.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes"></xsl:output> 
<xsl:template match = "/"> 

    <xsl:for-each select="//account"> 
     <item> 
      <id><xsl:value-of select="position()"/></id> 
      <po-num><xsl:value-of select="../../../*:po-num"/></po-num> 
      <seg><xsl:value-of select="./*:seg1"></xsl:value-of></seg> 
     </item> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+2

Was haben Sie versucht? Sorry, aber StackOverflow hilft Leuten, ihren bestehenden Programmiercode zu reparieren. Anfragen für Tutorien, Recherchen, Tools, Empfehlungen, Bibliotheken und kostenlosen Code sind nicht Thema. *** Bitte *** lesen https://stackoverflow.com/help/on-topic, https://stackoverflow.com/help/how-to-ask, https://stackoverflow.com/help/dont- Fragen Sie https://Stackoverflow.com/help/mcve und nehmen Sie die [Tour] (https://Stackoverflow.com/tour), bevor Sie weitere Qs hier veröffentlichen. Viel Glück. – shellter

+0

Hallo, ich kann meinen tatsächlichen Code coz aus verschiedenen Gründen nicht teilen, ich werde versuchen, einen Beispiel-XSLT-Code zu erstellen, der über Beispieleingabe unterstützt. Es ist nur ein riesiges Stück Code. Die obige Situation ist ein kleines Modul darin. –

Antwort

3

Try this:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"></xsl:output> 
    <xsl:template match = "/"> 

     <xsl:for-each select="//seg1"> 
      <item> 
       <id><xsl:value-of select="position()"/></id> 
       <seg><xsl:value-of select="."></xsl:value-of></seg> 
      </item> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Sie können bei http://xsltransform.hikmatu.com/jyyiVhm sehen Transformation

+0

Vielen Dank, das funktioniert wie ein Zauber und optimiert auch meinen Code. Da ich neu bei XSLT bin, fehlen mir einige offensichtliche Dinge. –

Verwandte Themen