467,923 Members | 1,157 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 467,923 developers. It's quick & easy.

XSL: NOT equal checking for node?

Hi,

I need to know how I can check to see if a particular node is NOT equal
to a SET of values.

i.e. a valid form of : <xsl:template match!="H" && match!="Y"&&
match!="Z">

I have an XML document of the foll format:

<ROOT>
<A>1</A>
<B>2</B>
<C>3</C>
.....
<H>4</H>
....
</ROOT>

I need to transform this into another format. Only the nodes <H>, <X>,
<Z> need special handling, which i refer to, via a corresponding
template calls.

All the other nodes, need to be transformed like this:

<A>1</A> becomes <A><Value>1</Value></A>

My xsl looks something like this:

<xsl:template match="/">
<NEWFORM>
<xsl:apply-templates/>
</NEWFORM>
</xsl:template>

/****template calls for H, X, Z**********/

<xsl:template match="H">
//special handling for <H>
</xsl:template>

How do I say: "for all nodes that are NOT H, X and Z, do this:" ?

something like:

for each child of root
not equal to X, H, Z
do the following:

Thanks for any help
Rohit.

Dec 1 '05 #1
  • viewed: 9501
Share:
7 Replies
This is basics -- you need to read a good book.

Use the XPath not() function and the "=" operator.
Almost never use the "!=" operator, especially if you are not 100% sure you
know what you're doing...
Cheers,
Dimitre Novatchev.
<Pi******@hotmail.com> wrote in message
news:11*********************@g44g2000cwa.googlegro ups.com...
Hi,

I need to know how I can check to see if a particular node is NOT equal
to a SET of values.

i.e. a valid form of : <xsl:template match!="H" && match!="Y"&&
match!="Z">

I have an XML document of the foll format:

<ROOT>
<A>1</A>
<B>2</B>
<C>3</C>
....
<H>4</H>
...
</ROOT>

I need to transform this into another format. Only the nodes <H>, <X>,
<Z> need special handling, which i refer to, via a corresponding
template calls.

All the other nodes, need to be transformed like this:

<A>1</A> becomes <A><Value>1</Value></A>

My xsl looks something like this:

<xsl:template match="/">
<NEWFORM>
<xsl:apply-templates/>
</NEWFORM>
</xsl:template>

/****template calls for H, X, Z**********/

<xsl:template match="H">
//special handling for <H>
</xsl:template>

How do I say: "for all nodes that are NOT H, X and Z, do this:" ?

something like:

for each child of root
not equal to X, H, Z
do the following:

Thanks for any help
Rohit.

Dec 1 '05 #2
Hi,

Thanks for your reply.

I just reread my post - i hope I didn't mislead you my saying
"particular node is NOT equal to a SET of values."

Just to clarify, i really want to be looking for all nodes other than
X, Y, and Z, and not their values as I had posted.

been struggling with this for a while, could you post a snippet plz?

Dec 1 '05 #3
Pi******@hotmail.com wrote:
Just to clarify, i really want to be looking for all nodes other than
X, Y, and Z, and not their values as I had posted.


*[not(self::X)][not(self::Y)][not(self::Z)]
--
Johannes Koch
Spem in alium nunquam habui praeter in te, Deus Israel.
(Thomas Tallis, 40-part motet)
Dec 1 '05 #4
> How do I say: "for all nodes that are NOT H, X and Z, do this:" ?

In XSLT one doesn't need to specifically write this.

you will have two templates:

<xsl:template match="*">
<!-- Whatever general transformation necessary here -->

</xsl:template>

<xsl:template match="H | X | Z">
<!-- A more specialized transformation here -->

</xsl:template>

The second template overrides the first for elements of type H, X, Z.

Just try it :o)
Cheers,
Dimitre Novatchev

<Pi******@hotmail.com> wrote in message
news:11*********************@g44g2000cwa.googlegro ups.com...
Hi,

I need to know how I can check to see if a particular node is NOT equal
to a SET of values.

i.e. a valid form of : <xsl:template match!="H" && match!="Y"&&
match!="Z">

I have an XML document of the foll format:

<ROOT>
<A>1</A>
<B>2</B>
<C>3</C>
....
<H>4</H>
...
</ROOT>

I need to transform this into another format. Only the nodes <H>, <X>,
<Z> need special handling, which i refer to, via a corresponding
template calls.

All the other nodes, need to be transformed like this:

<A>1</A> becomes <A><Value>1</Value></A>

My xsl looks something like this:

<xsl:template match="/">
<NEWFORM>
<xsl:apply-templates/>
</NEWFORM>
</xsl:template>

/****template calls for H, X, Z**********/

<xsl:template match="H">
//special handling for <H>
</xsl:template>

How do I say: "for all nodes that are NOT H, X and Z, do this:" ?

something like:

for each child of root
not equal to X, H, Z
do the following:

Thanks for any help
Rohit.

Dec 1 '05 #5
Johannes Koch wrote:
Pi******@hotmail.com wrote:
Just to clarify, i really want to be looking for all nodes other than
X, Y, and Z, and not their values as I had posted.


*[not(self::X)][not(self::Y)][not(self::Z)]


Probably far easier is to declare the null template for the unwanted
element types:

<xsl:template match="X|Y|Z"/>

///Peter
--
XML FAQ: http://xml.silmaril.ie/

Dec 1 '05 #6
Thanks. much better. The <xsl:template match="*"> seems to fit my
needs.

I have run into another problem,

1) how do I call the * template?

I'm need to convert all tags (other than those with special handling)
of the form
<A>1234<A>

to

<TAG>
<NAME>A</NAME>
<VALUE>1234</VALUE>
</TAG>

<xsl:template match="INPUT">
<NEW>
<A><xsl:value-of select="A"/></A>
<B><xsl:value-of select="B"/></B>
<xsl:apply-templates select="* />
<xsl:apply-templates select="SPECIAL" />
</NEW>
</xsl:template>
-----------------------------------------------------------------------------------
I must have the special handling tag after the * handling.

2) The * template is included below. Is it correct to say node() to get
the node name?
-----------------------------------------------------------------------------------
<xsl:template match="*">
<xsl:variable name="tag_value">
<xsl:value-of select="."/>
</xsl:variable>
<FEATURE>
<MNEMONIC><xsl:value-of select='node()'/></MNEMONIC>
<VALUE><xsl:value-of select="$tag_value"/></VALUE>
</FEATURE>
</xsl:template>
---------------------------------------------------------------------------------------------------------

Dec 2 '05 #7
Pi******@hotmail.com wrote:
Thanks. much better. The <xsl:template match="*"> seems to fit my
needs.

I have run into another problem,

1) how do I call the * template?


You don't. It gets used by anything that is not otherwise matched by an
existing template.

///Peter
--
XML FAQ: http://xml.silmaril.ie/
Dec 3 '05 #8

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

15 posts views Thread by Simon Harvey | last post: by
5 posts views Thread by Kasp | last post: by
7 posts views Thread by Sharon | last post: by
6 posts views Thread by Virginia Kirkendall | last post: by
6 posts views Thread by Loopy | last post: by
2 posts views Thread by Norman Barker | last post: by
4 posts views Thread by Tjerk Wolterink | last post: by
6 posts views Thread by Christoph | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.