2014-05-05 4 views
0

J'ai l'exemple de l'arbre xml ci-dessous.obtenir le premier élément dont le précédent

-root 
    -para 
    -page 
    -footnum 
    -para 
    -footnum 
    -para 
    -footnum 
    -para 
    -page 
    -footnum 

Je veux appliquer des modèles sur la première footnum dont précédente est page. De l'intérieur du modèle footnum. ici ci-dessous para il y aura encore plus de nœuds mais ici je veux appliquer-template seulement au premier footnum suivi de page,, que ce soit dans le même para ou différent.

Le code que j'ai essayé est comme ci-dessous.

<xsl:template match="footnote" mode="footnote"> 
    <xsl:variable name="rt"> 
<xsl:value-of select="//page/@num/following::footnote[1]/@num"/> 
    </xsl:variable> 
    <xsl:value-of select="$rt"/> 
<xsl:if test="contains($rt,@num)"> 
    <xsl:variable name="op">&#60;</xsl:variable> 
<xsl:variable name="apos">'</xsl:variable> 
<xsl:variable name="cl">&#62;</xsl:variable> 
<xsl:value-of select="concat($op,'?pb label=',$apos,./@num,$apos,'?',$cl)"/> 
    </xsl:if> 
     <div class="tr_footnote"> 
      <div class="footnote"> 
       <sup> 
       <a> 
         <xsl:attribute name="name"><xsl:text>ftn.</xsl:text><xsl:value-of select="@num"/></xsl:attribute> 
         <xsl:attribute name="href"><xsl:text>#f</xsl:text><xsl:value-of select="@num"/></xsl:attribute> 
         <xsl:attribute name="class"><xsl:text>tr_ftn</xsl:text></xsl:attribute> 
         <xsl:value-of select="@num"/> 
        </a> 
       </sup> 

      <xsl:apply-templates/> 
      </div> 
     </div> 
    </xsl:template> 

Mise à jour:

ici quand je suis en cours d'exécution de ce modèle, il me donne avant que les notes du nombre doit être placé, mais ici, je reçois le numéro de la note, mais pas le pagenumber . S'il vous plaît laissez-moi savoir comment je peux récupérer le numéro de page.

ici, il applique des modèles pour tous les footnums. s'il vous plaît laissez-moi savoir où je vais mal.

Merci

+0

À mon humble avis, le principal problème ici est de comprendre ce que vous voulez. Je soupçonne que si vous parvenez à expliquer votre exigence en anglais, la formulation XSLT suivra. –

Répondre

1

Vous êtes déjà dans le contexte de la note de bas de page.Pour obtenir le premier nœud de page précédent, vous devez utiliser

<xsl:variable name="rt" select="preceding-sibling::*[1][local-name()='page']/@num"/> 
+0

Salut @Joel, merci pour la réponse, cela ne fonctionne pas. – user2423959

+0

J'ai modifié ma réponse. –

+0

Salut Joel ça ne marche pas encore, je suis en train de mettre à jour ma question avec ce que j'ai essayé, je pense que je suis proche mais toujours dans un problème. – user2423959

1

Si (comme je pense que vous dites) que vous voulez appeler apply-templates au premier footnum avec un élément page précédent, alors votre premier problème est que l'instruction apply-templates dans votre exemple de code s'applique à l'élément de page, pas à l'élément footnum. Votre deuxième problème (que l'erreur soit dans votre code ou dans la description de votre problème) est que vous dites que vous ne voulez faire ce travail que dans certains cas (les conditions que vous avez en tête ne sont pas claires - un footnum par document, ou une fois par élément de page sur le premier footnum suivant cet élément de page, ou quelque chose d'autre), mais vous ne semblez pas avoir de test dans votre code qui teste la condition que vous avez en tête. Le test dans votre conditionnel est preceding::page[1], qui est également (en tant que booléen) avec preceding::page, et qui exclut tous les éléments footnum qui apparaissent avant tout élément page dans le document, et comprend tous les autres. En supposant que vos éléments de page marquent des sauts de page, et vos éléments de footnum marquent des numéros de note, et que vous voulez faire quelque chose de spécial pour la première note (le cas échéant) sur chaque page [si ce n'est pas le cas, devez apporter les ajustements appropriés à la solution], alors vous devez trouver une expression XPath qui renvoie true pour la première note sur chaque page, et pas pour les autres.

Quelle est la caractéristique cruciale ici du premier footnum sur chaque page? Qu'il n'y a pas d'autre élément footnum entre celui-ci et la page immédiatement précédente. Nous avons donc pu écrire (non testé):

<xsl:variable name="mypage" as="element(page)?" 
    select="preceding::page[1]"/> 
<xsl:variable name="preceding-footnum-on-same-page" 
    as="element(footnum)?" 
    select="preceding::footnum[preceding::page[. is $mypage]]"/> 
<xsl:if test="$mypage and not($preceding-footnum-on-same-page)"> 
    ... do your stuff here ... 
</xsl:if> 

Une autre façon de le formuler est: le noeud courant est le premier footnum sur la page actuelle si, lorsque nous trouvons la page en cours et trouve son premier footnum, il est le noeud courant.

<xsl:if test=". is ./preceding::page[1]/following::footnum[1]"> 
    ... 
</xsl:if> 

J'espère que cela aide.

+0

Salut @CNSperberg: Merci pour cette explication détaillée impressionnante, ici en deux mots, le modèle doit être appliqué n'importe où depuis la racine le premier frère d'une page est note, les deux logiques plus tôt, malheureusement, ils ne fonctionnent pas j'ai essayé – user2423959

+0

@ user2423959 "* ici en deux mots, le modèle doit être appliqué n'importe où depuis la racine le premier frère d'une page est une note, les deux logiques plus tôt *" Je ne pense pas que quelqu'un puisse comprendre ce que vous dites ici pas même une phrase. –

Questions connexes