XML : XSLT Match xml with database record

I need to use xslt: to check is xml item details match database lines details. Otherwise I need create report output with item details: ItemId, PartId and description.

I need to get something like this on report:

   **If xml file have more lines then db => print report**    <Report>    <Failure>      <Issues>        <Name>XML</Name>        <Issue>Xml file have more items when db</Issue>      </Issues>    </Failure>  </Report>    

or

If xml file lineId not match database lineId => print report

      <Report>        <Failure>          <faile>1</faile>          <Issues>            <Name>Line Number</Name>            <Issue>Document ItemId not match db ItemId.</Issue>            <LineItemDesc>ABC</LineItemDesc>          </Issues>        </Failure>      </Report>    

If xml file PartId not match database PartId of LineId(ABC)=> print report

     <Report>        <Failure>          <faile>2</faile>          <Issues>            <Name>Part Number</Name>            <Issue>Document PartId not match db PartId.</Issue>            <LineItemDesc>ABC</LineItemDesc>          </Issues>          <Issues>            <Name>Part Number</Name>            <Issue>Document PartId not match db PartId.</Issue>            <LineItemDesc>BCD</LineItemDesc>          </Issues>        </Failure>      </Report>    

This is xml file:

          <?xml version="1.0" encoding="utf-8"?>          <Xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >            <details>              <item>                <lineNum>1</lineNum>                <partNum>ABC</partNum>                <description>desc_2</description>              </item>              <item>                <lineNum>2</lineNum>                <partNum>BCD</partNum>                <description>desc_3</description>              </item>            </details>          </Xml>    

XSLT file

    <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" indent="yes"/>      <!--Data from DB-->    <xsl:variable name="Order">      <root>        <value lineNumber="1" partNumber="AAA" />        <value lineNumber="2" partNumber="ABC" />        <value lineNumber="3" partNumber="BCD" />      </root>    </xsl:variable>        <!--Retrieve order lines stored in(db)-->    <xsl:variable name="MatchOrderLines">      <xsl:for-each select="msxsl:node-set($Order)/root/value">        <item>          <xsl:attribute name="LineNumberFieldId">            <xsl:value-of select="@lineNumber" />          </xsl:attribute>          <xsl:attribute name="PartNumberFieldId">            <xsl:value-of select="@partNumber" />          </xsl:attribute>        </item>      </xsl:for-each>    </xsl:variable>          <xsl:template match="/">        <xsl:variable name="failureList">          <!--outer loop-->        <xsl:variable name="doc" select="Xml/details/item"/>        <xsl:for-each select="msxsl:node-set($MatchOrderLines)/item">          <xsl:variable name="dbRec" select="@LineNumberFieldId"/>            <!--inner loop-->          <xsl:variable name="var1">            <xsl:for-each select="$doc">              <xsl:variable name="docLineNum" select="lineNum"/>              <xsl:variable name="dbMatchDocField" select="contains($dbRec, $docLineNum)"/>            </xsl:for-each>          </xsl:variable>            <xsl:choose>            <xsl:when test="($var1) = 'true'">              <!--do next: if lineId match: need to match partId for current lineId-->              <xsl:choose>                <xsl:when test="">                  </xsl:when>                <xsl:otherwise>                  <failure >                    <field>Part Number</field>                    <issue>Document part id not match db partId of this LineId.</issue>                    <desc></desc>                  </failure>                </xsl:otherwise>              </xsl:choose>              </xsl:when>            <xsl:otherwise>              <failure >                <field>Line Number</field>                <issue>Document item id not match db item id.</issue>                <desc></desc>              </failure>            </xsl:otherwise>          </xsl:choose>          </xsl:for-each>      </xsl:variable>          <xsl:choose>        <!--if document not match db details: create report-->        <xsl:when test="count(msxsl:node-set($failureList)/failure) > 0">          <Report >            <Failure>              <xsl:for-each select="msxsl:node-set($failureList)/failure">                <Issues>                  <Name>                    <xsl:value-of select="field" />                  </Name>                  <Issue>                    <xsl:value-of select="issue" />                  </Issue>                  <LineItemDesc>                    <xsl:value-of select="desc" />                  </LineItemDesc>                </Issues>              </xsl:for-each>            </Failure>          </Report>        </xsl:when>          <xsl:otherwise>          <!--if document match db details: xml output-->          <Xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">            <details>              <xsl:for-each select="Xml/details/item">              <item>                            <lineNum>                    <xsl:value-of select="lineNum"/>                  </lineNum>                  <partNum>                    <xsl:value-of select="partNum"/>                  </partNum>                  <description>                    <xsl:value-of select="description"/>                  </description>                        </item>              </xsl:for-each>            </details>          </Xml>        </xsl:otherwise>        </xsl:choose>    </xsl:template>  </xsl:stylesheet>    

Thank you very much

No comments:

Post a Comment