2010-12-01 2 views
7

У меня есть файл XSL, который использует ссылку на статический веб-сайт, как показано ниже:Как прочитать файл .properties внутри .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> 

Мой вопрос заключается в том, что, как читать файл свойств (ключевое значение пары) в файле XSL. поэтому в моих файлах свойств (например, site.properties) У меня есть ключ под названием site т.е. site=testsite.com/services/testService/v1.0

Я хочу использовать этот ключ сайта вместо значения с указанием URL-адреса в XSL, т.е. http://testsite.com/services /testService/v1.0. Причина этого заключается в том, что эта ссылка изменяется в зависимости от различных сред.

Возможно ли это? Пожалуйста, приложите свои предложения или пример кода, если это возможно ... Также, если это невозможно ... есть ли какая-нибудь работа?

+1

Используя XSLT 2.0, это может быть достигнуто с помощью `fn: unparsed-text()`, но, вероятно, было бы проще просто отправить значение в качестве параметра в таблицу стилей. – 2010-12-01 15:58:46

+0

Я вообще не понимаю этот вопрос. Не могли бы вы объяснить, что это такое? Нет ввода и не требуется заданный выходной сигнал. – 2010-12-01 16:54:52

ответ

7

Как доказательство концепции:

входного .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". 

стилевых:

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

f:getProperty('language') вернется 'английский язык'.

См. Это как доказательство концепции, это нужно улучшить во многих отношениях, поскольку оно не обрабатывает многие разные способы создания файла .properties.

Я верю, что Алехандро или Димитрий, вероятно, могли бы улучшить это много раз.

5

Для решения XSLT 1.0 вы можете использовать external (parsed) general entity в файле XML, который загрузит файл свойств как часть содержимого XML.

Например, если у вас файл свойств, как это, по имени site.properties:

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

Вы можете создать простой файл XML, названный properties.xml, что «обручи» от содержания файла свойств и загружает его используя внешний разобранный общий объект:

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

Затем в вашем XSLT можно загрузить properties.xml с помощью функции document() и получить значение для данного ключа:

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

При применении к любому входу XML шаблон стиля выше будет производить следующий вывод:

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

Примечание: эта стратегия будет работать только в случае, если содержимое файла свойств является «безопасным XML» , Если он должен содержать символы, такие как & или <, это приведет к ошибке XML-анализа при загрузке файла properties.xml.