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