0

I have a xml table like this:

<tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">CIP Check - Tank Filter</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan/Install/Consume Vent Filters</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>

I have to replace 3rd element text in the entire xml with the "Step Reference" from the following xml string by comparing the TagName.

<Data>
    <row>
        <BoPName>OP_R_CFG_DEFINED_WEIGH_SEQUENCE</BoPName>
        <TagName>||MIN_CIP_EXPIRE_TIME||</TagName>
        <StepReference>Calculate Expiry</StepReference>
    </row>
    <row>
        <BoPName>OP_R_CFG_FIRST_ADD_EXP_INTERVAL</BoPName>
        <TagName>||MM_EXPECTED_FILTER_MATL_ID_01||</TagName>
        <StepReference>Scan Material</StepReference>
   </row>
<Data>

The CIP Check - Tank Filter has to be replaced with Calculate Expiry.

Please refer this picture

1
  • you have tagged this xslt-2 but put xslt 1 in the title, which do you want? Commented Feb 6, 2019 at 19:51

1 Answer 1

1

Assuming you want xslt 1.0 not 2.0, then something like

<table>
 <tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">CIP Check - Tank Filter</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan/Install/Consume Vent Filters</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>
</table>

with a data file tab2.xml

<Data>
    <row>
        <BoPName>OP_R_CFG_DEFINED_WEIGH_SEQUENCE</BoPName>
        <TagName>||MIN_CIP_EXPIRE_TIME||</TagName>
        <StepReference>Calculate Expiry</StepReference>
    </row>
    <row>
        <BoPName>OP_R_CFG_FIRST_ADD_EXP_INTERVAL</BoPName>
        <TagName>||MM_EXPECTED_FILTER_MATL_ID_01||</TagName>
        <StepReference>Scan Material</StepReference>
   </row>
</Data>

You can construct a key lookup such as

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

 <xsl:variable name="data" select="document('tab2.xml')"/>

 <xsl:key name="k" match="StepReference" use="../TagName"/>

 <xsl:template match="node()">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>


 <xsl:template match="td/font/text()">
  <xsl:variable name="here" select="."/>
  <xsl:variable name="tn" select="../../preceding-sibling::*[1]/font"/>
  <xsl:for-each select="$data">
   <xsl:choose>
    <xsl:when test="key('k',$tn)">
     <xsl:value-of select="key('k',$tn)"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$here"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </xsl:template>


</xsl:stylesheet>

Producing:

$ xsltproc tab.xsl tab.xml
<?xml version="1.0"?>
<table>
 <tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">Calculate Expiry</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan Material</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>
</table>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.