parse xml file

Hello all,

Given the following extract from a xml file with multiple <JOB> .... </JOB> entries

  <JOB
   APPLICATION="APP"
   APR="0"
   AUG="0"
   AUTHOR="AUT"
   AUTOARCH="0"
   CMDLINE="/tmp/test1 %%var"
   CONFIRM="1"
   CREATION_DATE="20100430"
   CREATION_TIME="130739"
   CREATION_USER="user"
   CRITICAL="0"
   CYCLIC="0"
   CYCLIC_TYPE="Interval"
   DAYS_AND_OR="OR"
   DEC="0"
   DESCRIPTION="This is a test for job1"
   FEB="0"
   IND_CYCLIC="START"
   INTERVAL="00000M"
   JAN="0"
   JOBNAME="TESTJOB"
   JUL="0"
   JUN="0"
   MAR="0"
   MAXDAYS="0"
   MAXRERUN="0"
   MAXRUNS="0"
   MAXWAIT="20"
   MAY="0"
   MEMNAME="JOB1"
   MULTY_AGENT="N"
   NODEID="SERVER1"
   NOV="0"
   OCT="0"
   OWNER="root"
   RETRO="0"
   SEP="0"
   SHIFT="IGNOREJOB"
   SHIFTNUM="+00"
   SYSDB="0"
   TAG_RELATIONSHIP="OR"
   TASKTYPE="Command"
   USE_INSTREAM_JCL="N"
>
   <QUANTITATIVE NAME="DRIVE1" QUANT="1"/>
   <OUTCOND NAME="JOB1-OK" ODATE="ODAT" SIGN="ADD"/>
   <AUTOEDIT EXP="%%SYSTEM=server1"/>
  </JOB>
  <JOB>
  ...........
   JOBNAME="TESTJOB2"
>
   .......
   <INCOND AND_OR="AND" NAME="JOB1-KO" ODATE="ODAT" />
  </JOB>

Can someone help me having the following output if I grep for exemple the keywork JOB1. Note: this keywork whill only be grepped in lines containing the tag INCOND and OUTCOND and then print the following output:

TESTJOB OUTCOND JOB1-OK
TESTJOB2 INCOND AND JOB1-KO

Thanks in advance for the attention

Regards,

Assuming the following simplified XML document (example1.xml) where I have removed most of the attributes to make the things easier to follow:

<JOBS>
   <JOB INTERVAL="00000M" JAN="0" JOBNAME="TESTJOB" JUL="0">
       <QUANTITATIVE NAME="DRIVE1" QUANT="1"/>
       <OUTCOND NAME="JOB1-OK" ODATE="ODAT" SIGN="ADD"/>
       <AUTOEDIT EXP="%%SYSTEM=server1"/>
   </JOB>
   <JOB INTERVAL="00000G" JAN="0" JOBNAME="TESTJOB2" JUL="0">
       <QUANTITATIVE NAME="DRIVE1" QUANT="1"/>
       <INCOND AND_OR="AND" NAME="JOB1-KO" ODATE="ODAT" />
       <AUTOEDIT EXP="%%SYSTEM=server1"/>
   </JOB>
</JOBS>

the following XSLT 1.0 stylesheet (example1.xsl) will output what you specified

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

   <xsl:param name="search"></xsl:param>

   <xsl:output method="text"/>

   <xsl:template match="/">
       <xsl:apply-templates select="//OUTCOND" />
       <xsl:apply-templates select="//INCOND" />
   </xsl:template>

   <xsl:template match="OUTCOND">
      <xsl:if test='contains(@NAME, $search)'>
         <xsl:value-of select="../@JOBNAME" />
         <xsl:text> OUTCOND </xsl:text>
         <xsl:value-of select="@NAME" />
         <xsl:text>
</xsl:text>
      </xsl:if>
   </xsl:template>

   <xsl:template match="INCOND">
      <xsl:if test='contains(@NAME, $search)'>
         <xsl:value-of select="../@JOBNAME" />
         <xsl:text> INCOND </xsl:text>
         <xsl:value-of select="@AND_OR" />
         <xsl:text> </xsl:text>
         <xsl:value-of select="@NAME" />
         <xsl:text>
</xsl:text>
      </xsl:if>
   </xsl:template>

</xsl;stylesheet>

Here is how you would perform the transformation using xsltproc where the search term is JOB1

$ xsltproc -param search "'JOB1'" example.xsl example.xml
TESTJOB OUTCOND JOB1-OK
TESTJOB2 INCOND AND JOB1-KO
$
1 Like

Perfect!
I didn't know xsltproc, thanks for your great help and time fpmurphy! :wink:

---------- Post updated 20th Oct 2010 at 11:16 AM ---------- Previous update was 19th Oct 2010 at 08:03 PM ----------

EDIT:
xsltproc is very powerfull and in order to improve my results I added the following code in your example.xsl :

   <xsl:template match="/">
       <xsl:apply-templates select="//QUANTITATIVE" />
   </xsl:template>

   <xsl:template match="QUANTITATIVE">
      <xsl:if test='contains(@NAME, $search)'>
         <xsl:value-of select="../@JOBNAME" />
         <xsl:text> </xsl:text>
         <xsl:value-of select="@NAME" />
         <xsl:text> </xsl:text>
         <xsl:value-of select="@QUANT" />
         <xsl:text> </xsl:text>
         <xsl:text>
</xsl:text>
      </xsl:if>
   </xsl:template>

This new code is working fine, the only thing is that when I do a command xsltproc -param search "'KEYWORD'" if KEYWORD exists in (OUTCOND or INCOND) and in QUANTITATIVE template it will print all matching results at the same time.

Is there a way to pass a parameter via xsltproc command line or something in order to print only (OUTCOND or INCOND) or QUANTITATIVE with just one example.xsl file ?

A solution would be to create multiples .xsl files but I would rather prefer having just one. Any idea fpmurphy or someone else ? :slight_smile:

Thanks for the attention!