![]() |
![]() | ![]() | ![]() | Altova Mailing List Archives>Archive Index >comp.text.xml Archive Home >Recent entries >Thread Prev - Pick/Choose XML from XSL >Thread Next - Re: Pick/Choose XML from XSL Re: Pick/Choose XML from XSLTo: NULL Date: 12/4/2004 7:13:00 PM Prabh wrote:
> Hello all,
> I want to HTML-ize an .xml (Test.xml) file and am running into a
> problem with my XSL file.
>
> The .xml contains info about each tag, called 'targets' and each
> target has a message with certain priority. I want to bundle all these
> targets in a top-area which have "a href" links to the details section
> down below. Also, I want to ignore messages with 'debug' priority and
> print only the 'info' priority messages.
>
>
> Test.xml:
> ==========================X M L==================================
> <?xml version="1.0" encoding="UTF-8" ?>
> <?xml-stylesheet type="text/xsl" href="Test.xsl"?>
>
> <main>
> <target name="TargetOne">
> <task>
> <message priority="info"><![CDATA[Info about Target One]]></message>
> </task>
> </target>
>
> <target name="TargetTwo">
> <task>
> <message priority="debug"><![CDATA[Info about Target Two: Ideally I
> shouldnt be displayed!!]]></message>
> </task>
> </target>
>
> <target name="TargetThree">
> <task>
> <message priority="info"><![CDATA[Info about Target Three]]>
> </message>
> </task>
> </target>
>
> </main>
>
> ==========================X M L==================================
>
>
>
> I've gotten this far with my .xsl:
>
> ==========================X S L==================================
>
> <?xml version="1.0"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="html" indent="yes"/>
>
> <xsl:template match="main">
> <html>
> <body>
>
> <!-- make header links -->
> <xsl:for-each select="target">
> <xsl:if test="@name='TargetOne'
> or @name='TargetTwo'
> or @name='TargetThree'">
> <a href="#{generate-id()}"> <xsl:value-of select="@name"/>
> </a>
> <br/>
> </xsl:if>
> </xsl:for-each>
>
> <hr/>
> <!-- show the targets, tasks and messages -->
> <xsl:apply-templates select="target"/>
>
> </body>
> </html>
>
> </xsl:template>
>
>
> <xsl:template match="target">
> <xsl:if test="@name='TargetOne'
> or @name='TargetTwo'
> or @name='TargetThree'">
> <a name="{generate-id()}"/>
> </xsl:if>
>
> <h4>
> <xsl:text>Target: </xsl:text>
> <xsl:value-of select="@name"/>
> </h4>
>
> <!-- show the messages -->
> <xsl:apply-templates select="task"/>
> </xsl:template>
>
> </xsl:stylesheet>
> ==========================X S L==================================
>
> I can now print the desired HTML with targets bundled up in a top-area
> with links to details down below. But, I'm unable to ignore/discard
> the 'debug' messages. I'm trying to use '<xsl:template
> match="message[@priority] != 'debug'
> but it doesn seem to work, the Target Two is always being printed.
>
> Could anyone give me pointers on how to go about this, please?
You're nearly there! The test for equality needs to be inside the predicate.
<xsl:template match="message[@priority != 'debug']">
</...>
You should use that in both the header link section, and the content
section.
Are your generated IDs linking up? the generate-id() function produces a
different value each time it is called. The one in your header won't
match the one in the content section! I'd use the @name attribute of the
<target> tag as the name to reference.
Nige
| ![]() | ![]() | ![]() |
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | |||||
|
