Pergunta

é de todo possível 'pré-proccess' em XSLT?

com pré-processamento i significa atualizar o (em memória representação) da árvore de origem.

isso é possível, ou eu preciso fazer várias transformações para ele.

caso de uso: temos manuais de referência Docbook para fora clientes, mas para certos clientes estes precisam de diferentes 'skins' (imagens diferentes, etc.). Então o que eu estava esperando para fazer é transformar a imagem fileref caminho, dependendo de um parâmetro. em seguida, aplicar o resto dos modelos normais Docbook XSL.

Foi útil?

Solução

Expandindo resposta de Eamon ...

No caso de qualquer XSLT 1.0 ou 2.0, você começar por colocar o resultado intermediário (pré-processado) em um elemento, declarou de forma global (de nível superior) ou localmente (dentro de um template ).

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

XSLT 2.0, o valor da variável $ intermediário-resultado é uma sequência que consiste nó de um nó de documento (foi chamado "nó raiz" em XSLT / XPath 1.0). Você pode acessar e usá-lo apenas como faria com qualquer outra variável, por exemplo, selecione = "$ intermediária resultado / doc"

Mas em XSLT 1.0, o valor da variável intermediária resultado $ não é uma primeira classe node-set. Ao contrário, é algo chamado um "fragmento de árvore de resultado". Ele se comporta como um conjunto de nós contendo um nó raiz, mas você está restrito em como você pode usá-lo. Você pode copiá-lo e obter a sua cadeia de valor, mas você não pode detalhar utilizando XPath, como em alguns = "$ intermediária resultado / doc". Para fazer isso, você deve primeiro convertê-lo para uma função de extensão de primeira classe usando node-set do seu processador de set-node (). Em Saxon 6.5, libxslt e 4XSLT, você pode usar exsl: node-set () (como na resposta de Eamon). Em MSXML, você precisa usar msxsl: nodeset (), onde xmlns: msxsl = "urn: schemas-microsoft-com: xslt", e em Xalan, eu acredito que ele é chamado xalan: nodeset () (sem a hífen, mas você vai ter que Google para o namespace URI). Por exemplo: selecionar = "exsl: node-set ($ intermediária resultado) / doc"

XSLT 2.0 simplesmente aboliu o fragmento de árvore de resultado, fazendo nó-set () desnecessário.

Outras dicas

Isso não é possível com os padrões XSLT compatível com 1.0. É possível em cada implementação real que eu usei, no entanto. As extensões com as quais fazer isso diferem pelo motor, no entanto. Também é possível em XSLT 2.0 padrão (que é, em qualquer caso muito mais fácil trabalhar com - por isso, se você pode, basta usar isso).

Se os seus suportes processador XSLT EXSLT , a exsl: node-set () função faz o que você está procurando. msxml tem uma função de extensão de nome idêntico, bem como (mas com um uri namespace diferente, as funções são, infelizmente, não trivialmente compatível).

Uma vez que você está tentando gerar a saída ligeiramente diferente da mesma fonte XML DocBook, que você pode querer olhar para o apoio "profiling" (condicional marcação) em folhas de estilo DocBook XSL. Consulte Capítulo 26 em DocBook XSL: The Complete Guia por Bob Stayton:

Profiling é o termo usado em DocBook para descrever texto condicional. Texto condicional significa que você pode criar um único documento XML com algum elementos marcados como condicionais. Quando você processar esse documento um, você pode especificar quais condições se aplicam para essa versão da produção, eo stylesheet vai incluir ou excluir o texto marcado para satisfazer as condições. Este recurso é útil quando você precisa para produzir mais de uma versão de um documento, e as versões diferem em pequenas formas.

Por exemplo, para usar imagens diferentes para, por exemplo, versões Windows e Mac do mesmo documento, você pode ter um fragmento XML DocBook como esta:

<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>

Em seguida, você usaria as versões habilitadas para perfilamento das folhas de estilo DocBook XSL com o profile.os parâmetro definido como windows ou mac.

Talvez você deve usar XSLT métodos "OOP" aqui. Coloque todos os modelos comuns a todos os clientes em uma folha de estilo, e criar uma folha de estilo para cada cliente com modelos específicos imperiosas mais comuns. Importar a folha de estilo comum dentro as específicas com xsl:. Importação, e você vai fazer apenas um processamento chamando o estilo correspondente a um cliente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top