You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2002/11/12 16:06:01 UTC
DO NOT REPLY [Bug 14472] New: -
MORE truncation error in XPathAPI.selectSingleNode()
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14472>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14472
MORE truncation error in XPathAPI.selectSingleNode()
Summary: MORE truncation error in XPathAPI.selectSingleNode()
Product: XalanJ2
Version: 2.4
Platform: PC
OS/Version: Windows NT/2K
Status: NEW
Severity: Major
Priority: Other
Component: org.apache.xpath
AssignedTo: xalan-dev@xml.apache.org
ReportedBy: sujansky@pacbell.net
I reported this bug (?) earlier, but would like to provide some more info now
to help you reproduce it. I reported it earlier as a truncation error in the
XPathAPI.selectSingleNode method. The error occurs when the following document
is transformed by the following stylesheet into a DOMResult, and then the
DOMResult is processed using XPathAPI.
*PLEASE* let me know if you can recreate this error, and, if so, whether there
is a workaround. Thanks.
THE DOCUMENT:
<?xml version="1.0" encoding="UTF-8"?>
<clinical_document>
<Questionnaire>
<CodedConcept>
<ConceptUUID>60</ConceptUUID>
</CodedConcept>
</Questionnaire>
<patient>08f1420b-0ae8-4ee7-8a6e-904fd584898b</patient>
<observations>12345</observations>
</clinical_document>
THE STYLESHEET:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:lxslt="http://xml.apache.org/xslt" version="1.0">
<xsl:output method="xml" />
<!-- Global parameters needed in each relational row -->
<!-- PatientUUID -->
<xsl:param name="PatientUUID">
<xsl:value-of select="/clinical_document/patient"/>
</xsl:param>
<!-- Top-level element -->
<xsl:template match="clinical_document">
<DBLoader>
<Database>
<xsl:text>Inoveon_AnDS</xsl:text>
</Database>
<xsl:apply-templates select="observations"/>
</DBLoader>
</xsl:template>
<xsl:template match="observations">
<Table>
<TableName>DemoFindings</TableName>
<Field>
<FieldName>PatientUUID</FieldName>
<FieldValue><xsl:value-of select="$PatientUUID"/></FieldValue>
</Field>
</Table>
</xsl:template>
</xsl:stylesheet>
THE PROBLEM:
After transformation, the resulting DOMResult instance is passed to a process
that tries to extract the text value of the PatientUUID, i.e. it extracts the
FieldValue text of the Field Node for which the FieldName text
= "PatientUUID".
This is done via the following XPathAPI calls:
1. XPathAPI.selectNodeList(xmlDoc,"//DBLoader/Table"); //get list of Table
nodes (only one returned in this case. It is passed to the next method)
2. XPathAPI.selectNodeList(tableNode,"Field"); //get list of Field nodes (only
one returned in this case also. It is passed to the next method).
(I've included the full listing of the method that extracts the field name, so
you can see where the 'printSerialized' debug output is generated)
3. public static String getFieldValue(Node fieldNode) throws
XMLDataAccessorException {
Node tempParentNode = null;
Node tempChildNode = null;
String fieldValue = "";
//Print entire Node
printSerialized(fieldNode);
System.out.println("\n");
try {
//Use XPathAPI call to extract the appropriate node, using an XPath
expression
tempParentNode = XPathAPI.selectSingleNode(fieldNode,"FieldValue");
//Print <Field> Node
printSerialized(tempParentNode);
System.out.println("\n");
//Some error checking
if (tempParentNode == null)
throw new XMLDataAccessorException("XMLDataAccessorException in
extracting Field value from DBLoader Field
Element: Field Element is missing FieldValue Element");
else {
tempChildNode = XPathAPI.selectSingleNode(tempParentNode,"text()");
if (tempChildNode == null)
fieldValue = ""; //if there's no text() node, the value is the empty
string for our purposes (this is not an
Exception)
else
fieldValue = tempChildNode.getNodeValue();
//Print <FieldValue> Node
printSerialized(tempChildNode);
System.out.println("\n");
}
}
catch (TransformerException te) {
throw new XMLDataAccessorException("XMLDataAccessorException in
extracting Field value from DBLoader Field
Element: TransformerException: " + te.getMessage());}
// If all is well, return the value
return fieldValue;
}
Now, when this method runs, the fieldValue string that is returned is a
*truncated* version of the string in the
original xml document. However, the debug information that's printed out
indicates that the full string is, indeed,
in the field Node, but gets truncated by the second call to
XPathAPI.selectSingleNode():
<?xml version="1.0" encoding="UTF-8"
standalone="no"?><Field><FieldName>PatientUUID</FieldName><FieldValue>08f1420b-
0ae8-4ee7-8a6e-904fd584898b</FieldValue
></Field>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<FieldValue>08f1420b-0ae8-4ee7-8a6e-904fd584898b</FieldValue>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
08f1420b-0ae8-4ee7-8a6e-90
Obviously, the value to be extracted has been truncated after the second call
to XPathAPI.selectSingleNode().