Hi,
You are not using namespaces, eh?
What I do for this is to set a key on the the rng:define's, like:
<xsl:key name="defs" match="rng:define" use="@name"/>
then when you match your rng:ref's you do:
<xsl:apply-templates select="key('defs', @name)/*"/>
For the form problem you posed earlier, you should be able to tell what kind of
form control to use from things like rng:choice = html:select, rng:oneOrMore =
html:input[(_at_)type=checkbox] etc... Or use a data type to set form fields,
e.g:
<rng:define name="description">
<rng:element
name="description"
a:label="Description"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rng:data type="token">
<rng:param name="maxLength">256</rng:param>
</rng:data>
</rng:element>
</rng:define>
Another useful thing to do is use annotations to provide a friendly label and
perhaps a default value among other things, like:
<rng:define name="language">
<rng:element
name="language"
a:label="Language"
a:default="en"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<rng:choice>
<rng:value type="NMTOKEN">en</rng:value>
<rng:value type="NMTOKEN">bg</rng:value>
</rng:choice>
</rng:element>
</rng:define>
and some XSLT (when matching the rng:element):
...
<xsl:when test="boolean(rng:choice)">
<select id="{$md_name}{$gen_id}" name="{$md_name}{$gen_id}">
<xsl:for-each select="rng:choice/rng:value">
<xsl:variable name="value" select="normalize-space(.)"/>
<option value="{$value}">
<xsl:if test="$current_nodeset_value=$value">
<xsl:attribute name="selected">selected</xsl:attribute>
</xsl:if>
<xsl:value-of select="$value"/>
</option>
</xsl:for-each>
</select>
</xsl:when>
...
make sense?
best,
-Rob
-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com]On Behalf Of S
Woodside
Sent: Monday, January 06, 2003 3:07 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] in-document references
I'm trying to transform a relax NG (RNG) grammar that has in-document
references (e.g. ref and define). I could just "flatten" the RNG but
I'd rather use the existing document. When I hit a ref in the RNG XML I
do this:
<xsl:template match="ref">
<li>Ref:
<b><xsl:value-of select="@name"/></b>
<ul>
<xsl:apply-templates
select="//define[(_at_)name=current()/@name]"
mode="def"/>
</ul>
</li>
</xsl:template>
which kind of works, except for a big problem. The template rules that
are called by this are out of context. In other words, I want to treat
them as though they are children of the element "ref" but instead they
are treated as top-level elements in the XML file (which is true, of
course).
How do I apply the templates and specify that the context should be the
current node?
Sorry if this is a FAQ, I couldn't find it.
Simon
---
www.simonwoodside.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list