Necesito especificar el orden de salida de un archivo html a un archivo de texto. Por lo tanto, uso el enfoque de selección xsl: apply-templates. Funciona bien, pero para ajustar la salida de los diferentes nodos, necesito una plantilla correspondiente, no solo una general. Esto también funciona bien, pero necesito repetir el patrón de selección en el patrón de coincidencia para la plantilla.

Me gusta definir una variable que contenga el patrón, por lo que solo debe definirse una vez. A continuación se muestra mi hoja de estilo simplificada y html simplificado que no funciona pero me da una idea de lo que quiero lograr. ¿Es posible utilizar variables como esta? Puedo usar xslt 1.0 y 2.0 si es necesario.

<xsl:stylesheet ...>
    ...

  <xsl:variable name="first">div[@class='one']</xsl:variable>
  <xsl:variable name="second">div[@class='two']</xsl:variable>

  <xsl:template match="/*">
    <xsl:apply-templates select="//$first"/>                                        
    <xsl:apply-templates select="//$second"/>                                       
    ...
  </xsl:template>

  <xsl:template match="//$first">
    <xsl:text>Custom text for class one:</xsl:text><xsl:value-of select="text()"/>
  </xsl:template>

  <xsl:template match="//$second">
    <xsl:text>Custom text for class two:</xsl:text><xsl:value-of select="text()"/>
  </xsl:template>

</xsl:stylesheet>   

El html:

...
<div class="two">text from two</div>
<div class="one">text from one </div>
...

Salida deseada:

Custom text for class one: text from one
Custom text for class two: text from two
0
user1100264 14 dic. 2016 a las 09:53

2 respuestas

La mejor respuesta

Las variables en XSLT contienen valores, no fragmentos de expresiones. (En otras palabras, XSLT no es un lenguaje de macros).

Como alternativa a la solución de Martin, que requiere XSLT 3.0, podría considerar el uso de lo que a veces se denominan "meta-hojas de estilo": realice una transformación como paso previo al procesamiento en la propia hoja de estilo. Incluso podría escribir la hoja de estilo genérica para usar la sintaxis XSLT 3.0 con atributos de sombra como _match, y hacer una fase de preprocesamiento XSLT para convertir esto a la sintaxis XSLT 1.0 o 2.0 normal para su ejecución.

0
Michael Kay 14 dic. 2016 a las 10:18

No hay forma de usar variables como esa en XSLT 1 o 2. La única forma sería escribir una hoja de estilo que produzca una segunda hoja de estilo y ejecutarla por separado.

En XSLT 3 hay nuevas funciones llamadas variables estáticas / parámetros y atributos de sombra que podrían ayudar o podría usar el Función transform para ejecutar una hoja de estilo recién generada directamente con XSLT en lugar de en un paso separado con un idioma anfitrión.

Pero usando XSLT 2 puede acortar el

<xsl:apply-templates select="//div[@class='one']"/>                                        
<xsl:apply-templates select="//div[@class='two']"/> 

Para

<xsl:apply-templates select="//div[@class='one'], //div[@class='two']"/>

Para completar, aquí está el enfoque XSLT 3 con dos parámetros estáticos utilizados en los atributos de sombra:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:param name="first" static="yes" as="xs:string" select="&quot;div[@class='one']&quot;"/>

    <xsl:param name="second" static="yes" as="xs:string" select="&quot;div[@class='two']&quot;"/>

    <xsl:template match="/*">
        <xsl:apply-templates _select="//{$first}, //{$second}"/>                                        
    </xsl:template>

    <xsl:template _match="{$first}">
        <xsl:text>Custom text for class one:</xsl:text><xsl:value-of select="text()"/>
    </xsl:template>

    <xsl:template _match="{$second}">
        <xsl:text>Custom text for class two:</xsl:text><xsl:value-of select="text()"/>
    </xsl:template>

</xsl:stylesheet>
0
Martin Honnen 14 dic. 2016 a las 07:44