2010-12-01 20 views
7

que tienen un archivo XSL que utiliza un enlace de una página web estática, como se muestra a continuación:¿Cómo leer un archivo .properties dentro de un archivo .xsl?

<xsl:template match="my_match"> 

    <xsl:variable name="variable1"> 
     <xsl:value-of select="sel1/Label = 'Variable1'"/> 
    </xsl:variable> 
    <xsl:copy-of select="sites:testPath('http://testsite.com/services/testService/v1.0', $fname, $lname, 
    $email , $zip, $phone, $comments, $jps, boolean($myvar), string(cust/@custID), string(@paID))"/> 
</xsl:template> 

Mi pregunta es que cómo leer un archivo de propiedades (par de valores clave) en el archivo XSL. Así que en mi archivo de propiedades (por ejemplo site.properties) tengo una clave llamada site es decir site=testsite.com/services/testService/v1.0

quiero usar esta tecla sitio en lugar de especificar el valor URL en el XSL es decir http://testsite.com/services /testService/v1.0. La razón para hacer esto es que este enlace cambia dependiendo de los diversos entornos.

¿Esto es posible? Por favor, dé sus sugerencias o un código de muestra si es posible ... Además, si esto no es posible ... ¿hay algún problema?

+1

Usando XSLT 2.0 esto podría lograrse con 'fn: unparsed-text()' pero probablemente sería más fácil simplemente enviar el valor como un parámetro a la hoja de estilos. –

+0

No entiendo esta pregunta en absoluto. ¿Puedes, por favor, explicar de qué se trata todo esto? No hay entrada ni salida especificada. –

+0

Para tener una pregunta, debe mostrar la entrada específica, la salida exacta deseada y establecer las propiedades que la transformación debe cumplir. No veo ni la entrada, ni la salida. Por favor, especifíquelos, si realmente necesita más que respuestas puramente teóricas. –

Respuesta

7

Como una prueba de concepto: archivo

entrada .properties:

# You are reading the ".properties" entry. 
! The exclamation mark can also mark text as comments. 
website = http://example.com 
language = English 
key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". 

de estilos:

<?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:f="Functions" 
    version="2.0"> 

    <xsl:variable name="properties" select="unparsed-text('.properties')" as="xs:string"/> 

    <xsl:template match="/" name="main"> 
    <xsl:value-of select="f:getProperty('language')"/> 
    </xsl:template> 

    <xsl:function name="f:getProperty" as="xs:string?"> 
    <xsl:param name="key" as="xs:string"/> 
    <xsl:variable name="lines" as="xs:string*" select=" 
     for $x in 
     for $i in tokenize($properties, '\n')[matches(., '^[^!#]')] return 
      tokenize($i, '=') 
     return translate(normalize-space($x), '\', '')"/> 
    <xsl:sequence select="$lines[index-of($lines, $key)+1]"/> 
    </xsl:function> 

</xsl:stylesheet> 

El f:getProperty('language') volverá 'Inglés'.

Considere esto como una prueba de concepto, esto debe mejorarse de muchas maneras, ya que no maneja muchas de las diferentes maneras en que se puede crear un archivo .properties.

Creo que Alejandro o Dimitrie probablemente podrían mejorar esto muchas veces.

+0

@ Per-T: En realidad, no entiendo esta pregunta en absoluto. ¿Puedes, por favor, explicar de qué se trata todo esto? No hay entrada ni salida especificada. –

+0

@Dimitre: Parece que está leyendo un archivo de texto/configuración simple. –

+0

@Per T: +1 Buena respuesta. Tomaría otro enfoque, como mapear ** todo ** el archivo en una representación XML durante el análisis, por lo que no lo harías para cada llamada a función. –

5

Para una solución XSLT 1.0, puede usar un external (parsed) general entity en un archivo XML que cargará el archivo de propiedades como parte del contenido XML.

Por ejemplo, si usted tenía un archivo de propiedades como esta, llamada site.properties:

foo=x 
site=http://testsite.com/services/testService/v1.0 
bar=y 

Se puede crear un archivo XML simple, nombrados properties.xml que "se devuelve" el contenido del archivo de propiedades y lo carga utilizando una entidad general externa analizada:

<!DOCTYPE properties [ 
    <!ENTITY props SYSTEM "site.properties"> 
]> 
<properties> 
&props; 
</properties> 

Luego, dentro de su XSLT puede cargar properties.xml que el uso de la función document() y obtener el valor de una clave dada:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:variable name="props" select="document('properties.xml')" /> 
    <xsl:template match="/"> 
     <output> 
      <example1> 
       <!--simple one-liner --> 
       <xsl:value-of select="substring-before(
             substring-after($props, 
                 concat('site','=')), 
             '&#xA;')" /> 
      </example1> 
      <example2> 
       <!--using a template to retrieve the value 
        of the "site" property --> 
       <xsl:call-template name="getProperty"> 
        <xsl:with-param name="propertiesFile" select="$props"/> 
        <xsl:with-param name="key" select="'site'"/> 
       </xsl:call-template> 
      </example2> 
      <example3> 
       <!--Another example using the template to retrieve 
        the value of the "foo" property, 
        leveraging default param value for properties --> 
       <xsl:call-template name="getProperty"> 
        <!--default $propertiesFile defined in the template, 
         so no need to specify --> 
        <xsl:with-param name="key" select="'foo'"/> 
       </xsl:call-template> 
      </example3> 
     </output> 

    </xsl:template> 

    <!--Retrieve a property from a properties file by specifying the key --> 
    <xsl:template name="getProperty"> 
     <xsl:param name="propertiesFile" select="$props"/> 
     <xsl:param name="key" /> 
     <xsl:value-of select="substring-before(
           substring-after($propertiesFile, 
               concat($key,'=')), 
           '&#xA;')" /> 
    </xsl:template> 

</xsl:stylesheet> 

Cuando se aplica a cualquier entrada XML la hoja de estilo anterior producirá el siguiente resultado:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <example1>http://testsite.com/services/testService/v1.0</example1> 
    <example2>http://testsite.com/services/testService/v1.0</example2> 
    <example3>x</example3> 
</output> 

Nota: esta estrategia sólo funcionará si el contenido del archivo de propiedades es "seguro XML" . Si contiene caracteres, como & o <, se generará un error de análisis XML cuando se cargue el archivo properties.xml.

Cuestiones relacionadas