Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Re: Does name exist [Thread Next] Re: Does name existTo: NULL Date: 8/7/2009 8:50:00 AM
"tshad" <toms@p...> wrote in message
news:ulW6EFsFKHA.3932@T......
>
> "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
>
>
I don't understand why you can't just read the post...
<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>
I use an xsl:choose. xsl:when the TITLEx element exists I show it,
xsl:otherwise I show the default value.
You can't 'overwrite' in a functional language as the concept of one
instruction coming after another doesn't apply in the same way as it does
for procedural code.
--
Joe Fawcett (MVP - XML)
http://joe.fawcett.name
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
