Susheel
Susheel

Reputation: 1

Preceding Sibling issue in xslt 1.0

I have an XML file where data is coming in this way:

<ROOT>
<LINE>
    <CODE>ZTAP</CODE>
    <TEXT>ZTAP TEXTVALUE</TEXT>
</LINE>
<LINE>
    <CODE>TAD</CODE>
    <TEXT>TAD TEXTVALUE1</TEXT>
</LINE>
<LINE>
    <CODE>TAD</CODE>
    <TEXT>TAD TEXTVALUE2</TEXT>
</LINE>
<LINE>
    <CODE>ZTAQ</CODE>
</LINE>
<LINE>
    <TEXT>ZTAQ TEXT1</TEXT>
</LINE>
<LINE>
    <TEXT>ZTAQ TEXT2</TEXT>
</LINE>
</ROOT>

The position of ZTAP and ZTAQ lines can be changed, for example

<ROOT>
<LINE>
    <CODE>ZTAQ</CODE>
</LINE>
<LINE>
    <TEXT>ZTAQ TEXT1</TEXT>
</LINE>
<LINE>
    <TEXT>ZTAQ TEXT2</TEXT>
</LINE>
<LINE>
    <CODE>ZTAP</CODE>
    <TEXT>ZTAP TEXTVALUE</TEXT>
</LINE>
<LINE>
    <CODE>TAD</CODE>
    <TEXT>TAD TEXTVALUE1</TEXT>
</LINE>
<LINE>
    <CODE>TAD</CODE>
    <TEXT>TAD TEXTVALUE2</TEXT>
</LINE>
</ROOT>

I need to pick the ZTAP LINES which i can do easily through template match. but i also need to pick all those LINES whose previous node is ZTAQ. There are few other LINES with TAD CODE which should not be picked, So if i take the 2nd example, then result should be:

ZTAQ TEXT1
ZTAQ TEXT2
ZTAP TEXTVALUE

My preceding sibling statement is mixing with ZTAP and ZTAQ due to other CODE LINES.:

xsl:template match="LINE" mode="test">
<xsl:if test="preceding-sibling::LINE[CODE = 'ZTAQ'] and not(preceding-sibling::LINE[CODE = 'ZTAP'</xsl:if>
    </xsl:template>

Could someone help please?

Upvotes: 0

Views: 156

Answers (1)

michael.hor257k
michael.hor257k

Reputation: 117140

I need to pick the ZTAP LINES which i can do easily through template match. but i also need to pick all those LINES whose previous node is ZTAQ.

If I understand this correctly, you want to call:

<xsl:apply-templates select="LINE[CODE='ZTAP' or not(CODE) and preceding-sibling::LINE[CODE][1]/CODE='ZTAQ']/TEXT"/>

from the context of ROOT.

Upvotes: 0

Related Questions