Как прочитать файл .properties внутри файла .xsl? - PullRequest
7 голосов
/ 01 декабря 2010

У меня есть 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. Причиной этого является то, что эта связь меняется в зависимости от различных сред.

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

Ответы [ 2 ]

7 голосов
/ 01 декабря 2010

В качестве подтверждения концепции:

Входной файл .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 может быть создан.

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

6 голосов
/ 22 апреля 2012

Для решения XSLT 1.0 можно использовать внешнюю (проанализированную) общую сущность в файле 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 safe". Если бы он содержал символы, такие как & или <, это привело бы к ошибке синтаксического анализа XML при загрузке файла properties.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...