XSL: NOT equal checking for node?

P

Piper707

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.
 
D

Dimitre Novatchev

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.
 
P

Piper707

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?
 
J

Johannes Koch

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)]
 
D

Dimitre Novatchev

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 :eek:)


Cheers,
Dimitre Novatchev
 
P

Peter Flynn

Johannes said:
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
 
P

Piper707

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>
---------------------------------------------------------------------------------------------------------
 
P

Peter Flynn

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top