XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Neal WaltersSubject: XPATH selecting higher node
Author: Neal Walters
Date: 26 Apr 2006 03:50 PM
Reference: http://www2.stylusstudio.com/SSDN/default.asp?action=9&read=4616&fid=48

This xpath return the desired property node:
/*[local-name()='MetaModel' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Property' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData'][@Name='MessageName' and @Value='msgConProcReq']

But I want to get the to retrieve one or two nodes higher.
How can I change the axis (is that the right question/terminology)?

Here's a fragment of the XML:
<om:Element Type="ServiceBody" OID="58eb1bd4-e860-4f66-a53d-ea4703f606e0" ParentLink="ServiceDeclaration_ServiceBody">
<om:Property Name="Signal" Value="False" />
<om:Element Type="Receive" OID="caeb374b-8722-4531-8ab3-ec0483ac3026" ParentLink="ServiceBody_Statement" LowerBound="93.1" HigherBound="115.1">
<om:Property Name="Activate" Value="True" />
<om:Property Name="PortName" Value="Port_ReceiveConReq" />
<om:Property Name="MessageName" Value="msgConProcReq" /> <!-- **** This is the value I'm matching on in my XPATH !!!!!!!! -->
<om:Property Name="OperationName" Value="Operation_1" />
<om:Property Name="OperationMessageName" Value="Request" />
<om:Property Name="ReportToAnalyst" Value="True" />
<om:Property Name="Name" Value="ReceiveConstituentProcessRequest" />
<om:Property Name="Signal" Value="True" />
<om:Element Type="DNFPredicate" OID="c78f07c0-2850-4e44-a5f8-50b882af480b" ParentLink="Receive_DNFPredicate">
<om:Property Name="LHS" Value="Compassion.BizTalk.Schemas.Common.PropertySchema.SchemaVersion" />
<om:Property Name="RHS" Value="1" />
<om:Property Name="Grouping" Value="AND" />
<om:Property Name="Operator" Value="LessThanOrEquals" />
<om:Property Name="Signal" Value="False" />
</om:Element>
</om:Element>
<om:Element Type="VariableAssignment" OID="091a9145-c3af-4510-b199-29b1bbb87bad" ParentLink="ServiceBody_Statement" LowerBound="115.1" HigherBound="134.1">
<om:Property Name="Expression" Value="// initialize variables&#xD;&#xA;// this comes from the configuration file&#xD;&#xA;blnTraceFlag = System.Convert.ToBoolean(System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.TraceFlag&quot;)); &#xD;&#xA;&#xD;&#xA;// these come from incoming SOAP Header (set in pipeline)&#xD;&#xA;strMessageStreamId = msgConProcReq(Compassion.BizTalk.Schemas.Common.MessageStreamId);&#xD;&#xA;strDateTime = System.Convert.ToString(msgConProcReq(Compassion.BizTalk.Schemas.Common.DateTimeStamp));&#xD;&#xA;strMessageId = msgConProcReq(Compassion.BizTalk.Schemas.Common.MessageId);&#xD;&#xA;&#xD;&#xA;// unique to this process&#xD;&#xA;strProcessId = System.Convert.ToString(msgConProcReq(BTS.InterchangeID));&#xD;&#xA;&#xD;&#xA;// set variables for the node names &amp; namespaces&#xD;&#xA;strCANodeName = System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.ConstituentActionNodeName&quot;);&#xD;&#xA;strCANamespace = System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.ConstituentActionNamespace&quot;);&#xD;&#xA;strConActionHolderNodeName = System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.ConstituentActionHolderNodeName&quot;);&#xD;&#xA;strConActionTypeRequestNamespace = System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.ConstituentActionTypeRequestNamespace&quot;);&#xD;&#xA;strConActionTypeReqSchemaVersion = System.Configuration.ConfigurationSettings.AppSettings.Get(&quot;Compassion.BizTalk.BusinessProcesses.Constituent.ConstituentRequestProcess.ConstituentActionTypeRequestVersion&quot;);" />
<om:Property Name="ReportToAnalyst" Value="True" />
<om:Property Name="Name" Value="InitializeProcessVariables" />
<om:Property Name="Signal" Value="True" />
</om:Element>



Thanks,
Neal Walters
http://Biztalk-Training.com



Postnext
Neal WaltersSubject: XPATH selecting higher node
Author: Neal Walters
Date: 26 Apr 2006 04:24 PM
Part 2 of this question. Why do I need to use the local-name in this case? The first line of the xml contains an xmlns:om clause:

<om:MetaModel MajorVersion="1" MinorVersion="3" Core="2b131234-7959-458d-834f-2dc0769ce683" ScheduleModel="66366196-361d-448d-976f-cab5e87496d2" xmlns:om="http://schemas.microsoft.com/BizTalk/2003/DesignerData">
<om:Element Type="Module" OID="3909d23a-6e5d-41f7-9512-6bd042cd555c" LowerBound="1.1" HigherBound="583.1">

But if I try Xpath such as /om:MetalModel/om:Element it returns nothing.

Neal


Postnext
Tony LavinioSubject: XPATH selecting higher node
Author: Tony Lavinio
Date: 26 Apr 2006 04:29 PM
If your context is the current node, then this would display it:
<xsl:value-of select="."/>

If you want the value of the parent node, you can use:
<xsl:value-of select=".."/>

For the grandparent:
<xsl:value-of select="../.."/>

For the first node named 'joe' that is a sibling of the current node:
<xsl:value-of select="../joe[1]"/>

The W3C spec on this isn't quite as dense as most, and actually
includes quite a few examples. See http://www.w3.org/TR/xpath

Also, a good summary of XPath is Ron Bourret's "XPath in Five
Paragraphs" at http://www.rpbourret.com/xml/XPathIn5.htm

Does this help, or am I totally misunderstanding your question?

Postnext
Tony LavinioSubject: XPATH selecting higher node
Author: Tony Lavinio
Date: 26 Apr 2006 04:32 PM
For part 2, it's hard to answer without seeing more context, but
usually it's because the XPath isn't running with the same namespace
prefix context as the XML.

For example, you might have xmlns:om="xyz" on the root template, but
not on some subsequent template.

Postnext
Neal WaltersSubject: XPATH selecting higher node
Author: Neal Walters
Date: 26 Apr 2006 05:35 PM
I'm not using XSLT. I'm using XmlDom in C#.NET 1.1 and trying to return the XML fragment for further parsing. Of course, I always test my XPath in Stylus Studio GUI first.

So if this wasn't one of those cases where I had to use the local-name clause, I would say something this:

/MetaModel/Element/Element/Element/Element[Property/@Type="MessageName" and Property/@Value="xxxxx"]

So the brackets would be my predicate after the last element node that I want.

With the local-names, it becomes 3 times harder...

Maybe something like this:
/*[local-name()='MetaModel']/*[local-name()='Element']/*[local-name()='Element']/*[local-name()='Element'][local-name()='Element'][Property/@Type="MessageName" and Property/@Value="msgConProcReq"]

but this gives 0 hits, because Property name cannot be referenced without the local-name clause.

We did some of this in this post: http://www2.stylusstudio.com/SSDN/default.asp?action=12&Reply=15026&fid=48&Thread=5018
The secret seemed to be putting two sets of [] next to each other. But in this case I'm trying to select higher, not lower or sideways.

Thanks again,
Neal Walters

Postnext
Neal WaltersSubject: XPATH selecting higher node
Author: Neal Walters
Date: 26 Apr 2006 05:42 PM
I think I understand "normal" XPath, but this local-name stuff drives me crazy. Basically, the whole Xpath becomes a predicate? Where is the axis?

Neal

Postnext
Neal WaltersSubject: XPATH selecting higher node
Author: Neal Walters
Date: 26 Apr 2006 06:08 PM
Here's another way to look at this:

This works, but returns all elements:

/*[local-name()='MetaModel' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData'][1]/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData'][1]/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']/*[local-name()='Element' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData']

I want to get the same type of data for one specific element.
Thus I wish to qualfiy or add a predicate to the above to limit based on the value of an attribute on the child.

Property is a child of the lowest element, and Property has two attributes, @Name and @Value.

If I add this to the above, then the axis shifts from the element to the property, and I only get the property:
/*[local-name()='Property' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData' and @Name='MessageName' and @Value='msgConProcReq']

I have also tried adding the same predicate as above without the /* at the beginning, then I get 0 hits.

Thanks, I'm just thinking out-loud and trying to give good examples for future people who have issues in this area.

Can you go back up the tree after a predicate in pure XPATH? such as this?
/*[local-name()='Property' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData' and @Name='MessageName' and @Value='msgConProcReq']/*[..]

This (above) returns 0 hits, but the following runs and still returns the Property only:

/*[local-name()='Property' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData' and @Name='MessageName' and @Value='msgConProcReq'][..][..]

and likewise with this:
/*[local-name()='Property' and namespace-uri()='http://schemas.microsoft.com/BizTalk/2003/DesignerData' and @Name='MessageName' and @Value='msgConProcReq'][../*][../*]

Neal




Posttop
Tony LavinioSubject: XPATH selecting higher node
Author: Tony Lavinio
Date: 28 Apr 2006 04:59 PM
Predicates are filters; axes move the cursor.

So you can go up and down the tree:

/root/parent/child[4]/..

gets you to the parent of the fourth child.

Does that help?

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.