cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

xslt code help needed

Former Member
0 Likes
562

Dear SAP experts,

Would you be able to help me in configuring the right xslt code to accomodate the looping logic?

Source Document:

School (occur only once)

- Name (can occur multiple times)

- Nickname (occur only once)

- Desired name (occur only once)

Target Document:

School

- Name

- Nickname (the value for this should be obtained from 'Desired name field')

- Desired name

I have this code, but seems not working in looping logic. (to accomodate the multiple Names):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" media-type="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="@*|node()">

<xsl:copy>

<xsl:apply-templates select="@*|node()"/>

</xsl:copy>

</xsl:template>

<xsl:template match="Order/OrderDetail/ListOfItemDetail/ItemDetail/BaseItemDetail/ItemIdentifiers/PartNumbers/BuyerPartNumber">

<BuyerPartNumber>

<PartNum>

<PartID>

<xsl:value-of select ="/Order/OrderDetail/ListOfItemDetail/ItemDetail/BaseItemDetail/ItemIdentifiers/PartNumbers/ManufacturerPartNumber/PartID"/>

</PartID>

</PartNum>

</BuyerPartNumber>

</xsl:template>

</xsl:stylesheet>

What happened is that the value was taken ONLY on the 1st line item. (1st Name occurence)

The succeeding Name field just copied the value of Nicknames from the 1st Name field.

Kindly advise how to handle the context (loop logic) in the xslt code.

Thanks!

View Entire Topic
Former Member
0 Likes

Hello,

I've tried this code,

<?xml version='1.0' encoding='UTF-8' ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="SenderPhysicalDUNS" select="'253066740'"/>

<xsl:output method="xml" version="1.0" media-type="xml" encoding="UTF-8" indent="yes"/>

<xsl:template match="@*|node()">

<xsl:copy>

<xsl:apply-templates select="@*|node()"/>

</xsl:copy>

</xsl:template>

<xsl:template match="/Order/OrderHeader/OrderReferences/AccountCode/Reference/RefNum">

<RefNum>

<xsl:value-of select="$SenderPhysicalDUNS"/>

</RefNum>

</xsl:template>

<xsl:template match="BuyerPartNumber/PartNum/PartID">

<PartID>

<xsl:value-of select="/Order/OrderDetail/ListOfItemDetail/ItemDetail/BaseItemDetail/ItemIdentifiers/PartNumbers/ManufacturerPartNumber/PartID"/>

</PartID>

</xsl:template>

</xsl:stylesheet>

But the output is still the same.

Only the 1st Part ID under BuyerPartNumber were copied in the 2nd, 3rd, .. iteration of ItemDetail. :'(

I've tried removing the "/" in the Order/OrderDetail... , but there was no value appearing in the BuyerPartNumber/PartNum/PartID..

Kindly provide your inputs.

Former Member
0 Likes

The ".." references the parent node of the current node. http://www.w3schools.com/XPath/xpath_syntax.asp The full xpath will always reference the first occurrence and is equivalent to this statement:

/Order/OrderDetail/ListOfItemDetail/ItemDetail[1]/BaseItemDetail/ItemIdentifiers/PartNumbers/ManufacturerPartNumber/PartID

You need an xpath statement relative to your current context (loop iteration):


  <xsl:template match="BuyerPartNumber/PartNum/PartID">
    <PartID>
      <xsl:value-of select="../../../ManufacturerPartNumber/PartID"/>
    </PartID>
  </xsl:template>