2011-03-11 5 views
2

J'essaie d'appeler le modèle ci-dessous à partir de mon code. Mais je continue à obtenir javax.xml.transform.TransformerException: erreur ElemTemplateElement: incrementValue.For un modèle différent, je reçois toujours javax.xml.transform.TransformerException: erreur ElemTemplateElement: templateName.Since la feuille de style est trop long, je suis en train de coller le code de la feuille de style. Quelqu'un peut-il me faire savoir ce que je fais mal ??xsl: call-template ne fonctionne pas en XSL

<xsl:stylesheet version = '2.0' 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" 
    xmlns:mngi="www.medianewsgroup.com" 
    exclude-result-prefixes="xs xdt mngi dirReader" 
    xmlns:date="http://exslt.org/dates-and-times" 
    xmlns:utildate="xalan://java.util.Date" 
    xmlns:dirReader="xalan://com.mngi.eidos.util.DirectoryReader" 
    extension-element-prefixes="date utildate dirReader"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" 
       indent="yes" 
       encoding="utf-8" 
       doctype-system="/SysConfig/Classify/Dtd/MNG/classify-story.dtd"/> 
    <xsl:template match="/"> 
     <xsl:processing-instruction name="EM-dtdExt" 
     >/SysConfig/Rules/MNG/MNG.dtx</xsl:processing-instruction> 
     <xsl:processing-instruction name="EM-templateName" 
     >/SysConfig/BaseConfiguration/MNG/Templates/MNG_story.xml</xsl:processing-instruction> 
     <xsl:processing-instruction name="xml-stylesheet" 
     >type="text/css" href="/SysConfig/BaseConfiguration/MNG/Css/MNG-story-nonechannel.css"</xsl:processing-instruction> 
     <!-- Added By Sachin --> 
     <xsl:processing-instruction name="EM-dtdExt" 
     >/SysConfig/Rules/MNG/MNG.dtx</xsl:processing-instruction> 
     <xsl:processing-instruction name="EM-templateName" 
     >/SysConfig/BaseConfiguration/MNG/Templates/MNG_story.xml</xsl:processing-instruction> 
     <xsl:processing-instruction name="xml-stylesheet" 
     >type="text/css" href="/SysConfig/BaseConfiguration/MNG/Css/MNG-story-nonechannel.css"</xsl:processing-instruction> 
     <xsl:variable name="UPPERCASE" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ '" /> 
     <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" /> 
     <xsl:variable name="HubName" select="translate(/Article/Hub/HubName, ' ', '')" /> 
     <xsl:variable name="lowerhubname" select="translate($HubName, $UPPERCASE, $lowercase)" /> 
     <xsl:variable name="SiteRoot" select="'C:/TwinCitiesArticles'" /> 
     <xsl:variable name="DatePath" select="translate(substring-before(/Article/PublishingDates/WebPublish_DTTM, 'T'), '-', '/')"/> 
     <xsl:variable name="PhotoDir" select="'photos/'" /> 
     <xsl:variable name="PhotoPath" select="concat($SiteRoot, $DatePath, '/', $lowerhubname, $PhotoDir)" /> 
     <TodaysDate> 
      <xsl:value-of select="utildate:new()"/> 
     </TodaysDate> 
     <imageDir> 
      <xsl:value-of select="$PhotoPath"/> 
     </imageDir> 
     <xsl:variable name="totalPhotos" select="dirReader:totalPhotos($PhotoPath)"/> 
     <xsl:variable name="photoList" select="dirReader:readDirectory($PhotoPath)"/> 
     <xsl:variable name="pName" select="dirReader:photoName($totalPhotos,$PhotoPath)"/> 
     <xsl:variable name="firstPhotoName" select="dirReader:firstPhoto($totalPhotos,$PhotoPath)"/> 
     <xsl:variable name="currentIdx" select="dirReader:currentIndex($firstPhotoName,$PhotoPath)"/> 
     <totalPhotos> 
      <xsl:value-of select="$totalPhotos" /> 
     </totalPhotos> 
     <xsl:template name="incrementValue"> 
      <xsl:param name="currentIdx"/> 
      <xsl:if test="$currentIdx &lt; $totalPhotos"> 
       <xsl:value-of select="$currentIdx"/> 
       <photoName> 
        <xsl:variable name="photoFromIndex" 
            select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/> 
        <xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/> 
       </photoName> 
       <xsl:call-template name="incrementValue"> 
        <xsl:with-param name="currentIdx" select="$currentIdx + 1"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:template> 
     <xsl:if test="$totalPhotos &gt; 0"> 
      <photoName> 
       <!--xsl:value-of select="$currentIdx"/--> 
       <xsl:variable name="photoFromIndex" select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/> 
       <xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/> 
      </photoName> 

       <xsl:call-template name="incrementValue"> 
        <xsl:with-param name="currentIdx" select="$currentIdx"/> 
       </xsl:call-template> 

     </xsl:if> 
+0

Pouvez-vous coller la feuille de style entière. – zode64

+0

Comme le XSL est trop long, j'ai collé une partie pertinente de ma feuille de style en l'éditant dans le post ci-dessus. Je ne suis pas en train d'importer des feuilles de style qui sont externes.Il y a 3 photos dans mon répertoire de photos.J'ai déclaré un modèle qui itère à travers le nombre de photos dans ce répertoire et j'ai besoin de ma sortie comme C: /photos/twincities/photo1.jpg C: /photos/twincities/photo2.jpg C: /photos/twincities/photo3.jpg

+0

@Sachin Paradkar: 'erreur ElemTemplateElement: incrementValue' parce que vous avez un' xsl: template' élément à l'intérieur du modèle de contenu d'un autre. –

Répondre

2

Votre xsl: si, xsl: value-of et xsl: variable tous besoin d'exister à l'intérieur d'un xsl: template, xsl: variable ou xsl: param, je ne sais pas si elles ne sont pas.

Un modèle xsl: doit être un enfant de xsl: stylesheet uniquement.

Vous devez supprimer les définitions de modèle à l'intérieur de la première <xsl:template match="/">

Définir le aticulations modèle incrementValue et mettre à l'intérieur de la principale <xsl:template match="/">

le contenu de l'autre modèle que vous avez quelque chose comme ceci:

<xsl:stylesheet version = '2.0' 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" 
xmlns:mngi="www.medianewsgroup.com" 
exclude-result-prefixes="xs xdt mngi dirReader" 
xmlns:date="http://exslt.org/dates-and-times" 
xmlns:utildate="xalan://java.util.Date" 
xmlns:dirReader="xalan://com.mngi.eidos.util.DirectoryReader" 
extension-element-prefixes="date utildate dirReader"> 
<xsl:strip-space elements="*"/> 
<xsl:output method="xml" 
      indent="yes" 
      encoding="utf-8" 
      doctype-system="/SysConfig/Classify/Dtd/MNG/classify-story.dtd"/> 
    ... 

<xsl:variable name="totalPhotos" select="dirReader:totalPhotos($PhotoPath)"/> 

    ... 

    <xsl:template match="/"> 

     ... 

     <xsl:if test="$totalPhotos &gt; 0"> 
      <photoName> 
      <!--xsl:value-of select="$currentIdx"/--> 
       <xsl:variable name="photoFromIndex" select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/> 
       <xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/> 
      </photoName> 
      <xsl:call-template name="incrementValue"> 
       <xsl:with-param name="currentIdx" select="$currentIdx"/> 
      </xsl:call-template> 
     </xsl:if>  
    </xsl:template> 
    <xsl:template name="incrementValue"> 
     <xsl:param name="currentIdx"/> 
     <xsl:if test="$currentIdx &lt; $totalPhotos"> 
      <xsl:value-of select="$currentIdx"/> 
      <photoName> 
       <xsl:variable name="photoFromIndex" select="dirReader:photoNameWithIndex($currentIdx,$PhotoPath)"/> 
       <xsl:value-of select="concat($PhotoPath,'',$photoFromIndex)"/> 
      </photoName> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

EDIT: Les variables utilisées dans les deux modèles devront être déclarées globalement comme je l'ai fait avec <xsl:variable name="totalPhotos" select="dirReader:totalPhotos($PhotoPath)"/> ci-dessus afin qu'elles soient disponibles pour les deux tem plaques car à la minute elles sont seulement limitées au gabarit dans lequel elles se trouvent. Vous pouvez aussi les passer en paramètres comme cela est fait avec <xsl:with-param name="currentIdx" select="$currentIdx"/>. S'il existe des variables qui n'existent que dans le modèle incrementValue, éloignez-les du modèle principal. AVERTISSEMENT: Ceci n'est pas testé car je ne comprends pas complètement le problème en raison du manque d'entrée, donc je ne fais que trier la syntaxe.

+0

Je ne reçois pas d'erreur lorsque je déclare un nouveau modèle, mais je reçois seulement une erreur en les appelant. –

+0

Je ne sais pas comment vous n'obtenez peut-être pas d'erreur avec les instructions qui sont appelées en premier mais il ne sera pas capable de trouver incrementValue sauf si sous xsl: stylesheet ou importé depuis une autre feuille de style – zode64