This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Schema Exploration...
- From: Mark Diggory <mdiggory at latte dot harvard dot edu>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Thu, 18 Apr 2002 18:37:46 -0400
- Subject: Re: [xsl] Schema Exploration...
- References: <5.1.0.14.0.20020418172253.01fe0cb0@earthlink.net>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Wendell Piez wrote:
> Mark,
>
> At 02:07 PM 4/18/2002, you wrote:
>
>> I'm trying to select a schema element node relative to the current
>> xs:element node I've referenced in a parameter ($schema_node). The
>> problem is that there are several cases that need to be checked for:
>>
>> xs:element/*[@name='test1a' or @ref='test1b']
>> xs:element/xs:complexType/xs:choice/*[@name='test2a' or @ref='test2b']
>> xs:element/xs:complexType/xs:sequence/*[@name='test3a' or @ref='test3b']
>
>
> You can take advantage of the fact that your schema should not have
> xs:elements with *both* a @name and a @ref to do something like:
>
> <xsl:variable name="okaynames" select="'test1a test1b test2a test2b
> test3a test3b'"/>
> <!-- the variable is not strictly necessary but makes things easier -->
> <xsl:apply-templates select=".//xs:element[contains($okaynames,
> (@name|@ref))]"/>
>
Ok, the attribute values for @name and @ref can't be hardcoded because
this is a general approach (test1a test1b .....) are just foobar's that
would come from the name() of the tag in the XML document.
> If I understand your problem correctly, this will work because:
>
> .//xs:element selects all xs:element descendants of the current node
> (*really* strictly, all xs:element children of nodes on the
> descendant-or-self axis from the current node). If your element
> declarations go down more than one level, you may have to be more
> specific with this step, as in select="(xs:element |
> xsl:complexType/xs:choice/xs:element |
> xs:complexType/xs:sequence/xs:element)[ ... the predicate ... ]"
>
This seems the most effective solution and it worked:
<xsl:variable name="my_snode" select="($parent_snode/xs:element |
$parent_snode/xs:complexType/xs:choice/xs:element |
$parent_snode/xs:complexType/xs:sequence/xs:element)[@name=$node_name or
@ref=$node_name]"/>
I don't suspect that a xs:element can fall anywhere else in another
xs:element. But if it does I can just add it to the select statement.
My current goal is to build a JSP/Saxon based XML Editor that config's
itself using an assigned schema. You'll be able to open any xml doc in
it and add/remove/edit the contents of it based on the schema. The
source of the doc will be configurable as well so that one can use it as
a front end for editing xml stored in a database or in a directory on a
server...
-Thanks (You just reduced the size of my xslt document by about 75%)
Mark
HMDC
> I hope that helps--
> Wendell
>
>
>
> ======================================================================
> Wendell Piez mailto:wapiez@mulberrytech.com
> Mulberry Technologies, Inc. http://www.mulberrytech.com
> 17 West Jefferson Street Direct Phone: 301/315-9635
> Suite 207 Phone: 301/315-9631
> Rockville, MD 20850 Fax: 301/315-8285
> ----------------------------------------------------------------------
> Mulberry Technologies: A Consultancy Specializing in SGML and XML
> ======================================================================
>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list