How to do a dynamic XML lookup within a repeat?

Hello;

I have a question regarding the best way (or any way) to from within a
repeat element, lookup XML from a different instance document using
information from the repeat's current element.

Specifically, I have a scenario where my XForm has two XML instances: the
primary instance contains data, the second instance contains metadata about
the primary.

I have a repeat group in my form that processes the data in the primary
document, but during the repeat processing I need to do an XPath lookup to
the metadata document based on information in the current element in the
repeat. That "lookup" will be used to display things like labels, etc.

As you can see from the snippet below, the repeat element iterates through
the primary document, displays information from that primary document, and
then tries to do a lookup to the metadata. The metadata lookup doesn't work.


...
<xforms:repeat id="resultRepeat"
nodeset="xforms:instance('sampleDocument')/*">
	<!-- display the data -->
	<xforms:output ref=".">
<xforms:label>.=</xforms:label>
	</xforms:output>
	</br>
	<!-- The problem is here!
	The following lookup does not work as expected because the
local-name(.) part of this XPath statement refers to the enclosing element
xforms:instance('metaData'). What I need is a way to refer to the current
node in the nodeset of the repeat element.
	-->
	<!-- display the metadata-->
	<xforms:output
ref="xforms:instance('metaData')/element[@name=local-name(.)]/@label">
		<xforms:label>MetaData Lookup=</xforms:label>
	</xforms:output>
	</br>
</xforms:repeat>

Any and all help would be greatly appreciated.

Regards,

Brian.

------

What follows here is the complete XForm demonstrating the problem using the
IE XForms plug-in from http://www.formsplayer.com.

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xforms="http://www.w3.org/2002/xforms/cr"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:ev="http://www.w3.org/2001/xml-events"
xmlns:wr="http://www.unisys.com/WebServices/"
xmlns:ad="http://webservices.eraserver.net/" xmlns:fp="urn:formsplayer.com">
	<object id="FormsPlayer"
classid="CLSID:4D0ABA11-C5F0-4478-991A-375C4B648F58">
		<b>FormsPlayer has not loaded. Please check your
installation or install forms player from http://www.formsplayer.com</b>
		<br />
		<br />
	</object>
	<?import namespace="xforms" implementation="#FormsPlayer" ?>
	<head>
		<title>Test Case</title>
		<xforms:model id="mdlMetaData" functions="fp:HTMLserialise">
			<xforms:instance id="metaData">
				<metaData>
					<element name="address"
label="Address"/>
					<element name="phone"
label="Telephone Number"/>
					<element name="fname" label="First
Name"/>
					<element name="lname" label="Last
Name"/>
					<element name="pono" label="Purchase
Order Number"/>
					<element name="item" label="Item"/>
					<element name="deliveryDate"
label="Delivery Date"/>
					<element name="element"
label="Fooey"/>
				</metaData>
			</xforms:instance>
		</xforms:model>
		<xforms:model id="mdlSampleDocument"
functions="fp:HTMLserialise">
			<xforms:instance id="sampleDocument">
				<person>
					<fname>Fred</fname>
					<lname>Flintstone</lname>
					<address>123 Shale St.,
Bedrock</address>
					<phone>23</phone>
				</person>
			</xforms:instance>
		</xforms:model>
	</head>
	<body>
		<div class="body">
			<h1>Test Case</h1>
			<p>
			This test case shows a problem with referencing
other instance documents from within repeating groups.
		</p>
			<xforms:group
ref="xforms:instance('sampleDocument')">
				<xforms:output ref="fp:HTMLserialise(.)"
class="debug">
					<xforms:label>Contents of
document</xforms:label>
				</xforms:output>
			</xforms:group>
			<xforms:group>
				<xforms:repeat id="resultRepeat"
nodeset="xforms:instance('sampleDocument')/*">
					<!-- display the data -->
					<xforms:output ref=".">
	
<xforms:label>.=</xforms:label>
					</xforms:output>
					</br>
					<!-- The problem is here!
					The following 
					-->
					<!-- display the metadata-->
					<xforms:output
ref="xforms:instance('metaData')/element[@name=local-name(.)]/@label">
						<xforms:label>MetaData
Lookup=</xforms:label>
					</xforms:output>
					</br>
					<xforms:output ref="local-name(.)">
	
<xforms:label>local-name(.)=</xforms:label>
					</xforms:output>
					</br>
					<xforms:output
ref="xforms:instance('metaData')/element[@name='fname']/@label">
						<xforms:label>'fname' Label
Lookup=</xforms:label>
					</xforms:output>
				</xforms:repeat>
			</xforms:group>
		</div>
	</body>
</html>

Received on Monday, 20 January 2003 13:22:04 UTC