This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: copy all attributes but one


Hi Chris,

> I tried the same for attributes, but this doesn't work - it copies all
> attributes:
>
>     <xsl:copy-of select="@*[not(attribute::DoNotCopyAttribute)]" />

In this XPath, you are saying:

  get a list of all the attributes on the current node, and filter it
  to include only those that do not have an attribute called
  DoNotCopyAttribute

Now, attributes can't have attributes, so the predicate always returns
true, and you get all the attributes.

The self:: axis that you use to test the name of elements doesn't work
because self::* only matches elements, so you also can't do:

   <xsl:copy-of select="@*[not(self::DoNotCopyAttribute)]" />

This will say:

  get a list of all the attributes on the current node, and filter it
  to include only those that are not themselves DoNotCopyAttribute
  elements

Attributes can never be elements, so the predicate always returns
true, and you get all the attributes.

The best way around it that I've seen is to locate the relevant
attribute and test whether the current attribute is the same node.  If
it is, then you don't want it; if it isn't, then you do.  So:

   <xsl:copy-of select="@*[generate-id(.) !=
                           generate-id(../@DoNotCopyAttribute)]" />

or:

   <xsl:copy-of select="@*[count(.|../@DoNotCopyAttribute) !=
                           count(../@DoNotCopyAttribute)]" />

whichever you find easiest to read or is quicker with your processor.

I hope that helps,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]