2010-10-08 34 views
4

Je viens de commencer à creuser dans XProc (en utilisant Calabash). J'ai une série de transformations XSLT que je veux appliquer à un seul document d'entrée pour produire un seul document de sortie. Auparavant, j'utilisais un simple script Python pour piloter les transformations, mais il me semblait que XProc pouvait convenir.Comment simplifier ce pipeline xproc?

Le pipeline ci-dessous semble fonctionner pour moi. Il s'agit essentiellement d'une liste des transformations XSLT qui doivent être appliquées, dans le bon ordre. Le problème est, il semble puissant redondant. J'espère qu'il y a un moyen de réduire cela, mais (pour l'instant) je ne peux pas me débrouiller tout seul.

<?xml version="1.0"?> 
<p:pipeline version="1.0" xmlns:p="http://www.w3.org/ns/xproc"> 
    <p:xslt name="remove-locations"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/remove-locations.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="divisions-1"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/divisions-1.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="divisions-2"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/divisions-2.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="subjects-1"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/subjects-1.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="subjects-2"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/subjects-2.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="types-1"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/types-1.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="types-2"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/types-2.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="core"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/core.xsl"/> 
     </p:input> 
    </p:xslt> 

    <p:xslt name="consolidate-descriptions"> 
     <p:input port="stylesheet"> 
      <p:document href="preprocessors/consolidate-descriptions.xsl"/> 
     </p:input> 
    </p:xslt> 
</p:pipeline> 

Répondre

5

Je me suis tourné vers la liste de diffusion xproc-dev pour l'aide, et une solution a été rapidement proposed et implemented pour moi. Cela m'a permis de simplifier la conduite ci-dessus jusqu'à ce (namespaces changé pour protéger les innocents):

<?xml version="1.0"?> 
<p:pipeline 
    version="1.0" 
    xmlns:p="http://www.w3.org/ns/xproc" 
    xmlns:ex="http://example.com"> 

    <p:declare-step type="ex:xslt" name="xslt"> 
     <p:input port="source" sequence="true" primary="true"/> 
     <p:input port="parameters" kind="parameter"/> 
     <p:output port="result" primary="true"/> 
     <p:option name="stylesheet" required="true"/> 

     <p:load name="load-stylesheet"> 
      <p:with-option name="href" select="$stylesheet"/> 
     </p:load> 

     <p:xslt> 
      <p:input port="stylesheet"> 
       <p:pipe port="result" step="load-stylesheet"/> 
      </p:input> 
      <p:input port="source"> 
       <p:pipe port="source" step="xslt"/> 
      </p:input> 
     </p:xslt> 
    </p:declare-step> 

    <ex:xslt stylesheet="remove-locations.xsl"/> 
    <ex:xslt stylesheet="divisions-1.xsl"/> 
    <ex:xslt stylesheet="divisions-2.xsl"/> 
    <ex:xslt stylesheet="subjects-1.xsl"/> 
    <ex:xslt stylesheet="subjects-2.xsl"/> 
    <ex:xslt stylesheet="types-1.xsl"/> 
    <ex:xslt stylesheet="types-2.xsl"/> 
    <ex:xslt stylesheet="core.xsl"/> 
    <ex:xslt stylesheet="consolidate-descriptions.xsl" /> 
</p:pipeline> 

(En fait, je séparé l'étape sur dans son propre fichier et <p:import>, donc le principal fichier de pipeline est encore plus simple que cela.)

0

Je ne vois pas de moyen de simplifier le pipeline ... sauf si vous modifiez les feuilles de style elles-mêmes. Par exemple. faire une feuille de style qui importe tous les autres et continue de passer la sortie de l'un à l'entrée de l'autre. (Cela nécessiterait XSLT 2.0 ou l'extension exsl: nodeset.)

Mais non, je ne vois pas un moyen de simplifier le pipeline XProc sans modifier d'autres choses.

+0

C'est une honte. Il semble que ce serait un cas d'utilisation assez commun et aurait une solution moins verbeuse. –

+0

@Will, je devrais ajouter que je ne suis pas un expert XProc ... Je viens de parcourir les spécifications et quelques tutoriels. J'ai eu XProc sur ma liste de vouloir-entrer-dans pendant plusieurs mois. – LarsH