Pregunta

¿Es del todo posible 'pre-proccess' en XSLT?

con preprocesamiento me refiero a la actualización de la (in memoria de representación) del árbol de origen.

Es posible esto, o tengo que hacer varias transformaciones para ello.

caso de uso: tenemos manuales de referencia Docbook para clientes fuera pero para ciertos clientes éstas necesitan diferentes 'skins' (diferentes imágenes, etc.). así que lo que yo estaba esperando que hacer es transformar la imagen fileref ruta en función de un parámetro. a continuación, aplicar el resto de las plantillas normales XSL Docbook.

¿Fue útil?

Solución

Ampliando la respuesta de Eamon ...

En el caso de cualquiera de XSLT 1.0 o 2.0, usted comenzaría poniendo el resultado intermedio (pre-procesado) en un elemento , declarada de forma global (nivel superior) o localmente (en el interior de una plantilla ).

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

En XSLT 2.0, el valor de la variable $ intermedia resultado es una secuencia de nodo que consiste en un nodo de documentos (que se llamó "nodo raíz" en XSLT / XPath 1.0). Puede acceder y utilizar del mismo modo que cualquier otra variable, por ejemplo, seleccione = "$ intermedio resultado / doc"

Pero en XSLT 1.0, el valor de la variable intermedia-$ resultado no es un conjunto de nodos de primera clase. En cambio, es algo que se llama un "fragmento de árbol de resultados". Se comporta como un conjunto de nodos que contiene un nodo raíz, pero usted está restringido en la forma en que se puede utilizar. Puede copiarlo y obtener su cadena de valor, pero no se puede desglosar el uso de XPath, como en select = "$ intermedio resultado / doc". Para ello, primero debe convertir a una primera clase de conjunto de nodos utilizando la función de extensión de su procesador conjunto de nodos (). En Saxon 6.5, libxslt y 4xslt, puede utilizar exsl: conjunto de nodos () (como en la respuesta de Eamon). En MSXML, que había necesidad de utilizar msxsl: nodeset (), donde xmlns: msxsl = "urn: schemas-microsoft-com: XSLT", y en Xalan, creo que se llama xalan: nodeset () (sin el guión, sino que tendrá que Google para el URI de espacio). Por ejemplo: seleccionar = "exsl: conjunto de nodos ($ intermedio-resultado) / doc"

XSLT 2.0 simplemente abolió el fragmento de árbol de resultados, haciendo conjunto de nodos () innecesaria.

Otros consejos

Esto no es posible con los estándares XSLT 1.0 compatible. Es posible en cada aplicación real que he usado, sin embargo. Las extensiones con las que hacen que difieren por el motor, sin embargo. También es posible en XSLT 2.0 estándar (que es, en cualquier caso mucho más fácil trabajar con - por lo que si se puede, que sólo tiene que utilizar).

Si su procesador XSLT apoya EXSLT , exsl: conjunto de nodos () función no hace lo que estás buscando. msxml tiene una función de extensión con el mismo nombre también (pero con un URI de espacio de nombres diferentes, las funciones no son compatibles por desgracia trivialmente).

Dado que usted está tratando de generar unos resultados ligeramente distintos de la misma fuente DocBook XML, es posible que desee ver en el apoyo (condicional marcado) en hojas de estilo XSL DocBook "perfil". Ver Capítulo 26 en DocBook XSL: The Complete Guide por Bob Stayton:

  

Profiling es el término utilizado en DocBook   para describir el texto condicional.   Texto condicional significa que puede crear   un único documento XML con un poco   elementos marcados como condicional. Cuando   que procesar un documento de este tipo, que pueda   especificar las condiciones para aplicar   esa versión de la producción y el   hoja de estilo se incluir o excluir el   texto marcado para satisfacer las condiciones.   Esta característica es útil cuando se necesita   para producir más de una versión de un   documento, y las versiones difieren en   formas menores.

Por ejemplo, para utilizar diferentes imágenes para, por ejemplo, las versiones de Windows y Mac del mismo documento, es posible que tenga un fragmento XML DocBook como esto:

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

A continuación, se usaría las versiones de perfiles habilitados de las hojas de estilo XSL DocBook con el parámetro profile.os establece en windows o mac.

Tal vez deberías utilizar XSLT métodos "POO" aquí. Poner todas las plantillas comunes a todos los clientes de una hoja de estilo, y crear una hoja de estilo para cada cliente con plantillas específicas primordiales de las más comunes. Importar la hoja de estilo común dentro de los específicos con XSL:. Importación, y que va a hacer sólo un procesamiento llamando a la hoja de estilo correspondiente a un cliente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top