|
Subject: Re: [xsl] Copying unknown attributes in XML to XML transformation? From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx> Date: Sat, 27 Jan 2001 11:30:27 +0000 |
Hi Bill,
> Yes, it is. The above is a little more verbose than the original solution
> proposed by a couple of people (below), but I think the syntax is simpler
> and if there are more than two or three attributes that need their values
> substituted, will be easier to maintain than this solution:
>
> <xsl:template match="connectionFactory">
> <connectionFactory host="{$host}" port="{$port}">
> <xsl:copy-of select="@*[name()!='host' and name()!='port']"/>
> </connectionFactory>
> </xsl:template>
Very possibly. One problem with the above solution in the general case
is that it doesn't work well with namespaced attributes: you need to
test local name and namespace URI or use an identity test to get
those, e.g.:
<xsl:copy-of
select="@*[not(local-name() = 'foo' and
namespace-uri() = 'http://www.bar.com/')]" />
or:
<xsl:copy-of
select="@*[count(.|../@bar:foo) != count(../@bar:foo)]" />
Copying everything and then overriding those attributes that you want
different values for saves you from having to do either of these.
> After a bit of experimentation, I came up with this:
> <xsl:template match="connectionFactory">
> <connectionFactory host="{$host}" port="{$port}">
> <xsl:copy-of select="@*[not(contains('host|port',name()))]"/>
> </connectionFactory>
> </xsl:template>
That's great as long as you don't have attribute names that are
substrings of each other. For example, if you wanted to filter out
'hostPort' attributes, but wanted to keep a 'host' attribute, then the
above solution will filter out the 'host' attributes as well.
> It still seems rather odd to me that where copying a selected list
> attributes (in this case) is so easy with:
> <xsl:copy-of select="@attr1|@attr2|@attr3"/>
> that there ought to also be a similarly easy way to copy all nodes except
> the specified ones. Maybe something like:
> <xsl:copy-of select="@*[exclude(@attr1|@attr2|@attr3)]"/>
> or
> <xsl:copy-of select="@*" exclude="@attr1|@attr2|@attr3"/>
If we were dealing with elements, then you could do:
<xsl:copy-of select="*[not(self::el1 or self::el2 or self::el3)]" />
But you can't use the self:: axis with attributes. Maybe just a set
difference function would work, like saxon:difference():
<xsl:copy-of select="saxon:difference(@*, @host | @port)" />
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Copying unknown attribute, Bill Burton | Thread | Re: [xsl] Copying unknown attribute, Dimitre Novatchev |
| RE: [xsl] Trying to use the SUM fun, Michael Kay | Date | Re: [xsl] Getting the deepest node , Jeni Tennison |
| Month |