Question

est-il possible de 'pré-proccess' dans XSLT?

avec prétraitement je veux dire la mise à jour (dans la représentation mémoire) de l'arbre source.

est-ce possible, ou est-ce que je dois faire plusieurs transformations pour elle.

cas d'utilisation: nous avons des manuels de référence DocBook pour les clients sur mais pour certains clients ceux-ci ont besoin de différentes « peaux » (différentes images, etc.). donc ce que j'espérais faire est de transformer l'image fileref chemin en fonction d'un paramètre. puis appliquer le reste des modèles XSL DocBook normaux.

Était-ce utile?

La solution

L'expansion sur la réponse Eamon ...

Dans le cas de l'une XSLT 1.0 ou 2.0, on pourrait commencer par mettre le résultat intermédiaire (prétraité) dans un élément, soit globalement déclaré (niveau supérieur) ou localement (à l'intérieur d'un modèle ).

<xsl:variable name="intermediate-result">
  <!-- code to create pre-processed result, e.g.: -->
  <xsl:apply-templates mode="pre-process"/>
</xsl:variable>

XSLT 2.0, la valeur de la variable intermédiaire $ résultat est une séquence de noeud constitué par un noeud de document (a été appelé « noeud racine » dans XSLT / XPath 1.0). Vous pouvez y accéder et l'utiliser comme vous le feriez pour tout autre variable, par exemple, select = « $ résultat intermédiaire / doc »

Mais dans XSLT 1.0, la valeur de la variable-résultat intermédiaire $ est pas une première classe ensemble de nœuds. C'est plutôt ce qu'on appelle un « fragment d'arbre résultat ». Il se comporte comme un ensemble de nœuds contenant un nœud racine, mais vous êtes limité dans la façon dont vous pouvez l'utiliser. Vous pouvez le copier et obtenir sa chaîne de valeur, mais vous ne pouvez pas forer vers le bas à l'aide XPath, comme select = « $ résultat intermédiaire / doc ». Pour ce faire, vous devez d'abord le convertir en un ensemble de nœuds de première classe utilisant ensemble de nœuds de votre processeur () la fonction d'extension. Saxon 6.5, libxslt et 4XSLT, vous pouvez utiliser exsl: node-set () (comme dans la réponse de Eamon). Dans MSXML, vous aurez besoin d'utiliser msxsl: nodeset (), où xmlns: msxsl = "urn: schemas-microsoft-com: xslt", et dans Xalan, je crois qu'il est appelé xalan: nodeset () (sans trait d'union, mais vous devrez Google pour l'espace de nom URI). Par exemple: select = "exsl: node-set (intermédiaire résultat $) / doc"

XSLT 2.0 simplement supprimé le fragment d'arbre résultat, ce qui rend node-set () inutile.

Autres conseils

Ceci est impossible avec les normes XSLT conformes 1.0. Il est possible dans chaque mise en œuvre effective que je l'ai utilisé, cependant. Les extensions avec lesquelles faire qui diffèrent par le moteur, cependant. Il est également possible dans XSLT 2.0 standard (ce qui est en tout cas beaucoup plus facile de travailler avec - donc si vous le pouvez, il suffit d'utiliser cela).

Si votre processeur xslt prend en charge EXSLT , exsl: node-set () fonction fait ce que vous cherchez. MSXML a une fonction d'extension de nom identique aussi bien (mais avec un uri espace de noms différents, les fonctions ne sont malheureusement pas compatibles trivialement).

Puisque vous essayez de générer une sortie légèrement différente de la même source XML DocBook, vous pouvez regarder dans le support « profilage » (balisage conditionnel) dans les feuilles de style XSL DocBook. Voir Chapitre 26 DocBook XSL: Le guide complet par Bob Stayton:

  

Le profilage est le terme utilisé dans DocBook   pour décrire le texte conditionnel.   Texte conditionnel signifie que vous pouvez créer   un document XML unique avec certains   éléments marqués comme étant conditionnel. Quand   vous traitez un tel document, vous pouvez   préciser quelles conditions une demande de   cette version de sortie, et la   stylesheet comprendra ou exclure   texte marqué pour satisfaire les conditions.   Cette fonction est utile lorsque vous avez besoin   pour produire plus d'une version d'un   document et les versions diffèrent   façons mineures.

Par exemple, utiliser des images différentes pour, par exemple, les versions Windows et Mac du même document, vous pourriez avoir un fragment XML DocBook comme ceci:

<figure>
  <title>The Foo dialog</title>
  <mediaobject>
    <imageobject os="windows">
      <imagedata fileref="screenshots/windows/foo.png"/>
    </imageobject>
    <imageobject os="mac">
      <imagedata fileref="screenshots/mac/foo.png"/>
    </imageobject>
  </mediaobject>
</figure>

Ensuite, vous devez utiliser les versions de profilage activé des feuilles de style XSL DocBook avec le paramètre de profile.os réglé sur windows ou mac.

Peut-être que vous devriez utiliser XSLT méthodes « POO » ici. Mettez tous les modèles communs à tous les clients dans une feuille de style, et de créer une feuille de style pour chaque client avec des modèles spécifiques prépondérants plus communs. Importez la feuille de style commun au sein de ceux spécifiques avec xsl:. Importation, et vous allez faire un seul traitement en appelant la feuille de style correspondant à un client

scroll top