xsl-list
[Top] [All Lists]

Re: Calling templates based on node contents

2004-08-18 04:05:28
Hi Ben,

Currently all of the contentFields go through the
<xsl:template match="." mode="defaultField_A"> template.

Given the XSL you included, that's normal: there's only one apply-templates:
<xsl:apply-templates mode="defaultField_A" select="contentFieldValue">

I can't see where (or under what conditions) you want to invoke the other mode?
Maybe you don't really need different modes altogether, but that's difficult
to say without more information.

BTW. it seems like the first two templates are meant for contentFieldValue
elements only, personally I would use match="contentFieldValue" here
rather than match="."

Best regards
Anton



----- Original Message ----- 
From: "Ben Gazzard" <BenG(_at_)tequila-uk(_dot_)com>
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Sent: Wednesday, August 18, 2004 12:25 PM
Subject: [xsl] Calling templates based on node contents


Hi All...

Have a little problem. Basically I have this XML structure:

<contentTable>
  <contentPage hasContent="1">
    <contentField ID="0" UID="31">
      <contentFieldID>0</contentFieldID>
      <contentFieldUID>31</contentFieldUID>
      <contentFieldName>new_Content_Field_0</contentFieldName>
      <contentFieldStyle>default</contentFieldStyle>
      <contentFieldElement>defaultField</contentFieldElement>
      <contentFieldHR>True</contentFieldHR>
      <contentFieldBTT>False</contentFieldBTT>
      <contentFieldValue>
        <contentItem ID="0">
          <contentItemValue type="text">Default text</contentItemValue>
          <contentItemValue type="label">Default label</contentItemValue>
          <contentItemValue type="url">Default url text</contentItemValue>
          <contentItemValue type="file">Default file text</contentItemValue>
          <contentItemValue type="DLfile">Default download 
text</contentItemValue>
        </contentItem>
      </contentFieldValue>
    </contentField>
  </contentPage>
</contentTable>

From this I need to generate html output. There are many different types of 
style and element that can be put into this XML and have
generated templates for these.

From these two nodes I want to call templates that format the XML accordingly.

I have got this far but im really stuck on how to call different templates 
based upon the contents of these nodes.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="." mode="defaultField_default">
<xsl:param name="style"/>
<span class="{$style}">
<xsl:value-of select="contentItem/contentItemValue[(_at_)type='text']"/>
</span>
</xsl:template>

<xsl:template match="." mode="defaultField_A">
<xsl:param name="style"/>
<a class="{$style}" href="{contentItem/contentItemValue[(_at_)type='url']}">
<xsl:value-of select="contentItem/contentItemValue[(_at_)type='text']"/>
</a>
</xsl:template>

<xsl:template match="contentPage">
<xsl:for-each select="contentField">
<xsl:sort select="@ID" order="ascending" data-type="number"/>
<xsl:apply-templates mode="defaultField_A" select="contentFieldValue">
<xsl:with-param name="style" select="concat(contentFieldElement, '_', 
contentFieldStyle)"/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Currently all of the contentFields go through the <xsl:template match="." 
mode="defaultField_A"> template.

Any help on this would be fantastic.

Thanks in advance.

Ben