return xpathData.buildXPath( modifier );
}
public static XPathData createXPathData( Node node, boolean anonymous, boolean selectText, boolean absolute )
{
StringToStringMap nsMap = new StringToStringMap();
List<String> pathComponents = new ArrayList<String>();
int nsCnt = 1;
String namespaceURI = node.getNamespaceURI();
// if( node.getNodeType() == Node.TEXT_NODE )
// {
// node = node.getParentNode();
// }
if( node.getNodeType() == Node.ATTRIBUTE_NODE )
{
if( namespaceURI != null && namespaceURI.length() > 0 )
{
String prefix = node.getPrefix();
if( prefix == null || prefix.length() == 0 )
prefix = "ns" + nsCnt++ ;
nsMap.put( namespaceURI, prefix );
pathComponents.add( "@" + prefix + ":" + node.getLocalName() );
}
else
{
pathComponents.add( "@" + node.getLocalName() );
}
node = ( ( Attr )node ).getOwnerElement();
}
else if( node.getNodeType() == Node.DOCUMENT_NODE )
{
node = ( ( Document )node ).getDocumentElement();
}
// else if( node.getNodeType() == Node.DOCUMENT_FRAGMENT_NODE )
// {
// node =
// ((DocumentFragment)node).getOwnerDocument().getDocumentElement();
// }
if( node.getNodeType() == Node.ELEMENT_NODE )
{
int index = anonymous ? 0 : findNodeIndex( node );
String pc = null;
namespaceURI = node.getNamespaceURI();
if( namespaceURI != null && namespaceURI.length() > 0 )
{
String prefix = node.getPrefix();
if( prefix == null || prefix.length() == 0 )
prefix = "ns" + nsCnt++ ;
while( !nsMap.containsKey( namespaceURI ) && nsMap.containsValue( prefix ) )
{
prefix = "ns" + nsCnt++ ;
}
nsMap.put( namespaceURI, prefix );
pc = prefix + ":" + node.getLocalName();
}
else
{
pc = node.getLocalName();
}
String elementText = XmlUtils.getElementText( ( Element )node );
// not an attribute?
if( selectText && pathComponents.isEmpty() && elementText != null && elementText.trim().length() > 0 )
pathComponents.add( "text()" );
pathComponents.add( pc + ( ( index == 0 ) ? "" : "[" + index + "]" ) );
}
else
return null;
node = node.getParentNode();
namespaceURI = node.getNamespaceURI();
while( node != null
&& node.getNodeType() == Node.ELEMENT_NODE
&& ( absolute || ( !"Body".equals( node.getNodeName() )
&& !SoapVersion.Soap11.getEnvelopeNamespace().equals( namespaceURI ) && !SoapVersion.Soap12
.getEnvelopeNamespace().equals( namespaceURI ) ) ) )
{
int index = anonymous ? 0 : findNodeIndex( node );
String ns = nsMap.get( namespaceURI );
String pc = null;
if( ns == null && namespaceURI != null && namespaceURI.length() > 0 )
{
String prefix = node.getPrefix();
if( prefix == null || prefix.length() == 0 )
prefix = "ns" + nsCnt++ ;
while( !nsMap.containsKey( namespaceURI ) && nsMap.containsValue( prefix ) )
{
prefix = "ns" + nsCnt++ ;
}
nsMap.put( namespaceURI, prefix );
ns = nsMap.get( namespaceURI );
pc = prefix + ":" + node.getLocalName();
}
else if( ns != null )
{