Subject: RE: [xsl] Namespace(?) question From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 7 Mar 2007 15:30:23 -0000 |
If you make this a schema-aware transformation in XSLT 2.0 (using the schema-for-schemas to validate the input document) then you can define a key on your complex types like this: <xsl:key name="ct" match="/xs:schema/xs:complexType" use="QName(/schema/@targetNamespace, @name)"/> and you can then retrieve them like this: key('ct', @type) (assuming they are defined in the same schema document, which is not really something you should assume...) This works because the XSLT processor knows that @type is a QName, because the schema says so, and it will automatically resolve the prefix part of the QName using the in-scope namespaces. If you're not using schema-aware processing, then the system has no knowledge that the attributes are QNames, and you're going to have to sort out the name matching by hand. If you're only looking for types defined in the same schema document then you can ignore the prefix, so it's not that difficult. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: sthomas2@xxxxxxx [mailto:sthomas2@xxxxxxx] > Sent: 07 March 2007 14:08 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Namespace(?) question > > > Sorry to bother everyone with a question whose answer is > probably in the FAQ, but I couldn't find it there. > > My input document (which happens to be a schema) has the > following form: > > > <xs:schema > xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:pfx="http://my.url" > targetNamespace="http://my.url" > elementFormDefault="qualified"> > > <xs:complexType name="ChildClass"> > <!-- details omitted -> > </xs:complexType> > > <xs:element name="ParentClass"> > <xs:complexType> > <xs:sequence> > <xs:element name="Property" type="pfx:ChildClass"/> > </xs:sequence> > </xs:complexType> > </xs:element> > > </xs:schema> > > > As part of its processing, my transform needs to identify all > complexType nodes that are referenced as types elsewhere in > the document. In the example above, I need to identify > ChildClass because it is a complexType that is referenced by > the "type" attribute within the ParentClass. > > I would expect the following to work: > > <xsl:template match="/"> > <xsl:for-each > select="(*/xs:simpleType|*/xs:complexType)[//@type=@name]"> > <!-- do something useful -> > </xsl:for-each> > </xsl:template> > > > But, at least with Saxon6.5.5 it selects nothing. It seems > like a namespace problem, since removing pfx: from the type > (and defining a default namespace) makes the transform work > as I expect it to. I suppose I could play around with > local-name() and get the transform to work, but that doesn't > seem like the right approach. I was thinking (hoping?) that > XSL would handle the namespace resolution automatically, but > clearly I am wrong. Or perhaps my select is wrong, and it > just happens to work by coincidence without namespace > prefixes. In any case, I would welcome enlightenment. > > Many thanks for your patience and thanks in advance for any > assistance, > > Stephen
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Namespace(?) question, David Carlisle | Thread | Re: [xsl] Looping a node in XSLT, Mukul Gandhi |
RE: [xsl] for-each-group usage, Angela Williams | Date | [xsl] inline within block within ta, John Cavalieri |
Month |