Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Re: Does name exist >Thread Next - Re: Does name exist Re: Does name existTo: NULL Date: 8/6/2009 11:11:00 AM
"Joe Fawcett" <joefawcett@n...> wrote in message
news:OzUX2arFKHA.3396@T......
>
> "tshad" <toms@p...> wrote in message
> news:#j$ftLrFKHA.3396@T......
>>
>> "Joe Fawcett" <joefawcett@n...> wrote in message
>> news:O5UvQAoFKHA.4732@T......
>>>
>>> "tshad" <toms@p...> wrote in message
>>> news:OjA0PNgFKHA.4316@T......
>>>> I figured out how to do this by:
>>>>
>>>> <source>
>>>> <xsl:if test="../../FIELDS/HEADER">
>>>> <xsl:value-of select="../../FIELDS/HEADER"/>
>>>> </xsl:if>
>>>> <xsl:if test="../../FIELDS/*[name() =
>>>> concat('TITLE',current()/@NUM)]">
>>>> <xsl:value-of select="../../FIELDS/*[name() =
>>>> concat('TITLE',current()/@NUM)]"/>
>>>> </xsl:if>
>>>> </source>
>>>>
>>>> But what I found that when both exists, it concatenates the 2nd test
>>>> with the first so that I end up with:
>>>>
>>>>
>>>> Subject Photo PageThis is Title1
>>>> Subject Photo Page
>>>> Subject Photo PageThis is Title3
>>>>
>>>> How do you tell it to delete what is there (in the 1st and 3rd case)
>>>> and put the new value there.?
>>>>
>>>> I could put 2 tests in the first part, but I would prefer to write out
>>>> the Headers text and if the 2nd test passes to overwrite what the
>>>> Header test put there. So I would end up with:
>>>>
>>>> This is Title1
>>>> Subject Photo Page
>>>> This is Title3
>>>>
>>>> Thanks,
>>>>
>>>> Tom
>>>>
>>>> "tshad" <toms@p...> wrote in message
>>>> news:uZ9YNkfFKHA.1488@T......
>>>>> How would you test if something exists?
>>>>>
>>>>> If you have:
>>>>>
>>>>> <FORM>
>>>>> <FIELDS>
>>>>> <HEADER>Subject Photo Page</HEADER>
>>>>> <TITLE1>This is Title1</TITLE1>
>>>>> <TITLE3>This is Title3</TITLE3>
>>>>> </FIELDS>
>>>>> <FORMPHOTOS>
>>>>> <PHOTO NUM="1">
>>>>> <FILENAME>09May001.jpg</FILENAME>
>>>>> <FILETYPE>JPEG</FILETYPE>
>>>>> </PHOTO>
>>>>> <PHOTO NUM="2">
>>>>> <FILENAME>09005.jpg</FILENAME>
>>>>> <FILETYPE>JPEG</FILETYPE>
>>>>> </PHOTO>
>>>>> <PHOTO NUM="3">
>>>>> <FILENAME>09002.jpg</FILENAME>
>>>>> <FILETYPE>JPEG</FILETYPE>
>>>>> </PHOTO>
>>>>> </FORMPHOTOS>
>>>>> </FORM>
>>>>>
>>>>> And I want to test if a name exists:
>>>>>
>>>>> Something like:
>>>>>
>>>>> <xsl:template match="FORMPHOTOS/PHOTO">
>>>>> <xsl:choose>
>>>>> <xsl:when test=". != ''">
>>>>> <attachment>
>>>>> <source>
>>>>> <xsl:choose>
>>>>>
>>>>> <xsl:when test="name() = concat('TITLE',current()/@NUM)
>>>>> exists"> <--------
>>>>>
>>>>> <xsl:value-of select="../../FIELDS/*[name() =
>>>>> concat('TITLE',current()/@NUM)]"/>
>>>>> </xsl:when>
>>>>> <xsl:otherwise>
>>>>> <xsl:value-of select="../../FIELDS/HEADER"/>
>>>>> </xsl:otherwise>
>>>>> </xsl:choose>
>>>>> </source>
>>>>> </attachment>
>>>>> </xsl:when>
>>>>> </xsl:choose>
>>>>> </xsl:template>
>>>>>
>>>>> What I want to happen here is that for the nodes that have NUM = 1 or
>>>>> 3 to use TITLE1 and TITLE3 (since they exist), otherwise use HEADER.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Tom
>>>>>
>>>>
>>>>
>>>
>>> You could use something like this:
>>> <?xml version="1.0" encoding="utf-8"?>
>>> <xsl:stylesheet version="1.0"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>>> <xsl:output method="xml" indent="yes"/>
>>>
>>> <xsl:template match="/">
>>> <photos>
>>> <xsl:apply-templates select="FORM/FORMPHOTOS/PHOTO"/>
>>> </photos>
>>> </xsl:template>
>>>
>>> <xsl:template match="PHOTO">
>>> <photo NUM="{@NUM}">
>>> <xsl:variable name="titleElementName" select="concat('TITLE',
>>> @NUM)" />
>>> <xsl:choose>
>>> <xsl:when test="/FORM/FIELDS/*[local-name() =
>>> $titleElementName]">
>>> <xsl:value-of select="/FORM/FIELDS/*[local-name() =
>>> $titleElementName]" />
>>> </xsl:when>
>>> <xsl:otherwise>
>>> <xsl:value-of select="/FORM/FIELDS/HEADER" />
>>> </xsl:otherwise>
>>> </xsl:choose>
>>> </photo>
>>> </xsl:template>
>>>
>>> </xsl:stylesheet>
>>>
>>> The XML schema is poor, having elements like TITLE1, TITLE2 etc will
>>> always make processing difficult, better to use attributes:
>>> <TITLE number="1" />
>>> for example.
>>
>> That looks good.
>>
>> I agree on the TITLE1 and TITLE2 issue but the XML that I am processing
>> is not mine so I have no control over the names of the elements.
>>
>> I did find another way to solve the checking if a name exists:
>>
>> <xsl:if test="../../FIELDS/HEADER">
>> <xsl:value-of select="../../FIELDS/HEADER"/>
>> </xsl:if>
>> <xsl:if test="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]">
>> <xsl:value-of select="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]"/>
>> </xsl:if>
>>
>> This one works fine but if HEADER exists and TITLEx exists, then they
>> will concatenate.
>>
>> That was the other question I had, how to get the 2nd test to wipe out
>> whatever is in the field instead of concatenating. The above could end up
>> with:
>>
>> Subject Photo PageThis is Title1
>>
>> instead of:
>>
>> This is Title1
>>
>> Because HEADER existed.
>>
>> I solved this problem by using a CHOOSE instead of IF.
>>
>> <xsl:choose>
>> <xsl:when test="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]">
>> <xsl:value-of select="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]"/>
>> </xsl:when>
>> <xsl:when test="../../FIELDS/HEADER">
>> <xsl:value-of select="../../FIELDS/HEADER"/>
>> </xsl:when>
>> </xsl:choose>
>>
>> In this case Header will not happen if TITLEx is found.
>>
>> But is there a way to make the work where by default HEADER will get
>> written out and if TITLEx is found, it will overwrite what was in HEADER
>> instead of just adding to it.
>>
>> <xsl:value-of select="../../FIELDS/HEADER"/>
>> <xsl:if test="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]">
>> <xsl:value-of select="../../FIELDS/*[name() =
>> concat('TITLE',current()/@NUM)]"/>
>> </xsl:if>
>>
>> Thanks,
>>
>> Tom
>>>
>>> Regards
>>>
>>> --
>>>
>>> Joe Fawcett (MVP - XML)
>>> http://joe.fawcett.name
>>
>>
>
> I don't quite understand, my stylesheet outputs the relevant TITLEx if
> it's there, otherwise the HEADER element.
>
Not sure why yours is working. Are you using:
<xsl:value-of select="../../FIELDS/HEADER"/>
<xsl:if test="../../FIELDS/*[name() =
concat('TITLE',current()/@NUM)]">
<xsl:value-of select="../../FIELDS/*[name() =
concat('TITLE',current()/@NUM)]"/>
</xsl:if>
This one in my file always puts the 2 together if the TITLEx exists.
Otherwise only the HEADER is shown.
Thanks,
Tom
> --
>
> Joe Fawcett (MVP - XML)
> http://joe.fawcett.name
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
