sherly
asked on
XPath Question
I need to select MarkNameNodes (with MarkObjectType='TEXT') and its LaserFontNodes, InkFontNodes from a xml document. If a LaserFont or InkFont nodes are not found, display '-".
I have this code :
var MarkNameNodes=theRoot.sele ctNodes("/ /MarkTempl ate["0"]/M arkingObje cts/MarkOb ject[MarkO bjectType= 'TEXT']/Ma rkName");
var LaserFontNodes=theRoot.sel ectNodes(" //MarkTemp late["0"]/ MarkingObj ects/MarkO bject[Mark ObjectType ='TEXT']/L aserFont") ;
var InkFontNodes=theRoot.selec tNodes("// MarkTempla te["0"]/Ma rkingObjec ts/MarkObj ect[MarkOb jectType=' TEXT']/Ink Font");
var strMarkObjectTable="<table border='1' id='MarkObjectGroup'>";
strMarkObjectTable += "<tr><td>MarkName</td><td> Laser</td> <td>Ink</t d></tr>";
for (i=0;i<MarkNameNodes.lengt h;i++){
if ( MarkNameNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ MarkNameNodes.item(i).text +"</td>";
} else {
strMarkObjectTable += "<td>-</td>";
}
if (LaserFontNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ LaserFontNodes.item(i).tex t +"</td>";
} else {
strMarkObjectTable += "<td>-</td>";
}
if ( InkFontNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ InkFontNodes.item(i).text +"</td>";
} else {
strMarkObjectTable += "<td>-</td>";
}
strMarkObjectTable += "</tr>";
}
strMarkObjectTable += "</table><br>";
divMarkObject.innerHTML=st rMarkObjec tTable;
it returns me the result of :
MarkName Laser Ink
-------------------------- --------
001 12 12
002 12 9
003 - -
the correct result should be :
MarkName Laser Ink
-------------------------- --------
001 - 12
002 12 9
003 12 -
this is the xml :
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMarkTemplate>
<MarkTemplate>
<MarkType>MARKTYPE001</Mar kType>
<ImageId>854</ImageId>
<MarkingObjects>
<MarkObject>
<MarkName>001</MarkName>
<MarkObjectType>TEXT</Mark ObjectType >
<InkFont>12</InkFont>
</MarkObject>
<MarkObject>
<MarkName>002</MarkName>
<MarkObjectType>TEXT</Mark ObjectType >
<LaserFont>12</LaserFont>
<InkFont>9</LaserFont>
</MarkObject>
<MarkObject>
<MarkName>003</MarkName>
<MarkObjectType>TEXT</Mark ObjectType >
<LaserFont>12</LaserFont>
</MarkObject>
<MarkObject>
<MarkName>004</MarkName>
<MarkObjectType>GRAPHIC</M arkObjectT ype>
<ObjectText>GRAPHIC001</Ob jectText>
<InkFont>10</InkFont>
</MarkObject>
</MarkingObjects>
</MarkTemplate>
<MarkTemplate>
......
</MarkTemplate>
</ArrayOfMarkTemplate>
Please advise in what is the right way to code to get the correct result.
I have this code :
var MarkNameNodes=theRoot.sele
var LaserFontNodes=theRoot.sel
var InkFontNodes=theRoot.selec
var strMarkObjectTable="<table
strMarkObjectTable += "<tr><td>MarkName</td><td>
for (i=0;i<MarkNameNodes.lengt
if ( MarkNameNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ MarkNameNodes.item(i).text
} else {
strMarkObjectTable += "<td>-</td>";
}
if (LaserFontNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ LaserFontNodes.item(i).tex
} else {
strMarkObjectTable += "<td>-</td>";
}
if ( InkFontNodes.item(i) != null ) {
strMarkObjectTable += "<tr><td>"+ InkFontNodes.item(i).text +"</td>";
} else {
strMarkObjectTable += "<td>-</td>";
}
strMarkObjectTable += "</tr>";
}
strMarkObjectTable += "</table><br>";
divMarkObject.innerHTML=st
it returns me the result of :
MarkName Laser Ink
--------------------------
001 12 12
002 12 9
003 - -
the correct result should be :
MarkName Laser Ink
--------------------------
001 - 12
002 12 9
003 12 -
this is the xml :
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMarkTemplate>
<MarkTemplate>
<MarkType>MARKTYPE001</Mar
<ImageId>854</ImageId>
<MarkingObjects>
<MarkObject>
<MarkName>001</MarkName>
<MarkObjectType>TEXT</Mark
<InkFont>12</InkFont>
</MarkObject>
<MarkObject>
<MarkName>002</MarkName>
<MarkObjectType>TEXT</Mark
<LaserFont>12</LaserFont>
<InkFont>9</LaserFont>
</MarkObject>
<MarkObject>
<MarkName>003</MarkName>
<MarkObjectType>TEXT</Mark
<LaserFont>12</LaserFont>
</MarkObject>
<MarkObject>
<MarkName>004</MarkName>
<MarkObjectType>GRAPHIC</M
<ObjectText>GRAPHIC001</Ob
<InkFont>10</InkFont>
</MarkObject>
</MarkingObjects>
</MarkTemplate>
<MarkTemplate>
......
</MarkTemplate>
</ArrayOfMarkTemplate>
Please advise in what is the right way to code to get the correct result.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
selectNodes gives you the set of nodes that do exist
so your result is a pretty logical one
why don't you select the MarkObject
and access the childNodes, if existent as childnodes of this MarkObject node
Then you are sure that the allignment is correct
Cheers!