RE: [xsl] How to use the same expression in a match and a select test

Subject: RE: [xsl] How to use the same expression in a match and a select test
From: Sascha Mantscheff <922492@xxxxxx>
Date: Mon, 03 Dec 2007 14:59:17 +0100
I love this list. Thank you all.

Am Montag, den 03.12.2007, 13:57 +0000 schrieb Michael Kay:
> You're using XSLT 2.0 so you can write $NO_BLOCK_ELEMENTS and
> $SAME_ATTRIBUTES as stylesheet functions returning a boolean:
> 
> <xsl:function name="f:is-no-block-element" as="xs:boolean">
>   <xsl:param name="n" as="element()"/>
>   <xsl:sequence select="not(self::blockquote|self::center...)"/>
> </xsl:function>
> 
> match="*[is-no-block-element(.)]"
> 
> Alternatively, many of the elements listed have a schema type of Inline in
> the XHTML schema, so you could refer to them collectively as element(*,
> Inline) if you import the schema.
> 
> The test string-join(@*,'xx') = string-join(current()/@*,'xx') looks wrong -
> it's relying on the order in which attributes are returned by @*, which may
> vary from one element to the next.
> 
> It looks to me as if your code could also benefit from using
> <xsl:for-each-group group-adjacent="...">
> 
> Michael Kay
> http://www.saxonica.com/
> 
> 
> > -----Original Message-----
> > From: Sascha Mantscheff [mailto:922492@xxxxxx] 
> > Sent: 03 December 2007 13:21
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] How to use the same expression in a match and 
> > a select test
> > 
> > I have a stylesheet with a template and a for-each statement.
> > Both select their elements by an expression which differs 
> > only in one part from each other.
> > 
> > The template is:
> > 
> > <xsl:template match="*[not(self::blockquote|self::center|self::BODY|
> > self::body|self::div|self::dl|self::dt|self::HEAD|self::head|s
> > elf::HTML|
> > self::img|self::h1|self::h2|self::h3|self::h4|self::h5|self::h6|
> > self::hr|self::html|self::idx:*|self::form|
> > self::mbp:*[not(self::mbp:nu)]|self::mmc:*|self::ol|self::p|se
> > lf::table|
> > self::td|self::th|self::tr|
> > self::ul)][preceding-sibling::node()[1][name()=name(current()) and
> > string-join(@*,'xx') = string-join(current()/@*,'xx')]]"
> > />
> > 
> > The for-each select is:
> > 
> > <xsl:for-each 
> > select="following-sibling::node()[1][not(self::blockquote|
> > self::center|self::BODY|self::body|self::div|self::dl|self::dt|
> > self::HEAD|self::head|self::HTML|self::img|self::h1|self::h2|self::h3|
> > self::h4|self::h5|self::h6|self::hr|self::html|self::idx:*|self::form|
> > self::mbp:*[not(self::mbp:nu)]|self::mmc:*|self::ol|self::p|se
> > lf::table|
> > self::td|self::th|self::tr|self::ul)] [name()=name(current()) and
> > string-join(@*,'xx') = string-join(current()/@*,'xx')]">
> > 
> > How can I reduce the redundancy and use the same expression 
> > in both statements, like in this pseudo code:
> > 
> > <xsl:template
> > match="*[$NO_BLOCK_ELEMENTS][preceding-sibling::node()[1][name
> > ()=name(current()) and $SAME_ATTRIBUTES]]"
> > />
> > 
> > <xsl:for-each select="following-sibling::node()[1][$NO_BLOCK_ELEMENTS]
> > [name()=name(current()) and $SAME_ATTRIBUTES]">

Current Thread