Как прочитать файл .properties внутри файла .xsl?

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

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


person Sameer Malhotra    schedule 01.12.2010    source источник
comment
При использовании XSLT 2.0 этого можно добиться с помощью fn:unparsed-text(), но, вероятно, было бы проще просто отправить значение в качестве параметра в таблицу стилей.   -  person Per T    schedule 01.12.2010
comment
Я вообще не понимаю этого вопроса. Объясните, пожалуйста, что это вообще такое? Ввод и желаемый вывод не указаны.   -  person Dimitre Novatchev    schedule 01.12.2010
comment
Чтобы задать вопрос, вы должны показать конкретный вход, точный желаемый результат и указать свойства, которым должно удовлетворять преобразование. Я не вижу ни входа, ни выхода. Пожалуйста, укажите их, если вам действительно нужно больше, чем чисто теоретические ответы.   -  person Dimitre Novatchev    schedule 01.12.2010


Ответы (2)


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

Входной файл .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.

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

person Per T    schedule 01.12.2010
comment
@Per-T: На самом деле я вообще не понимаю этот вопрос. Объясните, пожалуйста, что это вообще такое? Ввод и желаемый вывод не указаны. - person Dimitre Novatchev; 01.12.2010
comment
@Dimitre: Похоже, он читает текстовый/простой файл конфигурации. - person ; 01.12.2010
comment
@Per T: +1 Хороший ответ. Я бы выбрал другой подход, такой как сопоставление всего файла с представлением XML во время синтаксического анализа, поэтому вы не делаете это для каждого вызова функции. - person ; 01.12.2010
comment
@Alejandro: Следующее, чего я ожидаю, - это вопрос об обработке любого романа и преобразовании его в XML - почему мы должны терпеть такие плохие вопросы? - person Dimitre Novatchev; 01.12.2010
comment
@Dimitre: Джа! Я не уверен, что это такой уж плохой вопрос. Я думаю, что это плохой выбор дизайна: зачем нужно обрабатывать простой текстовый файл с помощью XSLT? Но обратите внимание, что синтаксический анализ с помощью RegExp (или просто RegExp, если нет рекурсивной сбалансированной структуры) будет методом реализации этого на любом другом языке. Я не видел ответа вроде: используйте этот конкретный язык, который использует выраженную грамматику в кратком синтаксисе и анализирует текстовый файл, если только вы не используете какую-либо функциональную реализацию синтаксического анализатора и комбинатора синтаксического анализатора. - person ; 01.12.2010
comment
@Dimitre: я создаю мобильное приложение, и эта ссылка: testsite.com/services/testService/v1 .0 (как показано в шаблоне xsl) ссылается на один из веб-сайтов. Но его значение может быть изменено в зависимости от того, находится ли он в производстве, разработке или веб-сайте реального времени. Таким образом, в среде разработки это значение может быть localhost:8080/services/testService/v1.0. Если бы я мог изменить это в файле свойств, тогда не нужно было бы беспокоиться об изменении его где-либо еще... Надеюсь, я ответил на него... Если нет, задайте мне еще один вопрос... - person Sameer Malhotra; 01.12.2010
comment
@Sameer: ​​Чтобы задать вопрос, вы должны показать конкретный вход, точный желаемый результат и указать свойства, которым должно удовлетворять преобразование. Я не вижу ни входа, ни выхода. Пожалуйста, укажите их, если вам действительно нужно больше, чем чисто теоретические ответы - person Dimitre Novatchev; 01.12.2010
comment
@Alejandro: я не возражаю против обработки текста - я нахожу нелепым отсутствие какого-либо указанного ввода и любого указанного желаемого вывода. Не могу поверить, что люди могут всерьез задавать такие вопросы. - person Dimitre Novatchev; 01.12.2010
comment
@Dimitre: я могу согласиться с тем, что вопрос можно было бы уточнить и что я сделал некоторые предположения. Я предположил, что Самир хотел проанализировать файл .properties, часто используемый в java-приложениях, и в этом случае данные в файле не имеют большого значения, поскольку мы знаем синтаксис файла. Моя идея заключалась в том, чтобы сделать универсальное решение для любого файла .properties, функцию, которая возвращала бы значение свойства для любого заданного ключа свойства. - person Per T; 02.12.2010
comment
@Per-T: Я уверен, что ты проделал хорошую работу. Однако никто из тега xslt не должен знать, что такое файл .properties. - person Dimitre Novatchev; 02.12.2010
comment
@Dimitre: Это простой вопрос. Я не знаю, почему вы делаете из этого большое дело. Мне не нужно рассказывать вам общую архитектуру или что-то в этом роде. Простой вопрос заключается в том, как прочитать файл свойств (пара значений ключа) в файле xsl. поэтому в моем файле свойств (site.properties) у меня есть ключ с именем site=testsite.com/services /testService/v1.0, и я хочу использовать этот ключ сайта вместо указания значения URL-адреса в xsl. Если вы не знаете ответа, это нормально. Просто не усложняйте задачу другим. Я ценю вашу помощь. Спасибо Per-T, я попробую ваше решение.... - person Sameer Malhotra; 02.12.2010
comment
@Sameer: ​​Теперь вы впервые предоставили необходимую информацию, чтобы сделать этот вопрос более похожим на настоящий вопрос. Пожалуйста, отредактируйте свой вопрос и поместите его туда. Бывает, что я умею решать такие задачи (раз уж они действительно определены) :) На самом деле я написал на XSLT парсер для JSON и для XPath 2.0. - person Dimitre Novatchev; 02.12.2010
comment
@Per-T: Есть ли какое-либо возможное решение для XSLT1.0, поскольку это версия, которую мы используем сейчас?.. Я могу убедить свою команду использовать xslt2.0, но это займет целую вечность, чтобы получить одобрение.... - person Sameer Malhotra; 02.12.2010
comment
@Sameer: ​​Не так, как я пытался решить это сейчас. XSLT 1.0 не может анализировать содержимое обычного текста файл, поскольку Димитре объясняет связанный вопрос. Но, как я уже говорил ранее, вы можете вместо этого отправить значение свойства в качестве параметра через ваш синтаксический анализатор и в таблицы стилей. Просто объявите значение по умолчанию в ваших таблицах стилей, которое может быть перезаписано в зависимости от вашей рабочей среды. - person Per T; 03.12.2010
comment
@Per T: Когда я использую приведенный выше код, возникает ошибка (в Firefox): Ошибка во время преобразования XSLT: была вызвана неизвестная функция расширения XPath. Об этой ошибке есть несколько тем, но после того, как я пытаюсь удалить пространство имен f: и xs:, это все равно не работает. Есть ли у вас какие-либо идеи ? - person ramcrys; 15.03.2016
comment
@ramcrys: этот код никогда не предназначался для использования в браузере. Насколько мне известно, ни один браузер не поддерживает XSLT 2.0 и, вероятно, никогда не будет. - person Per T; 18.03.2016

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

person Mads Hansen    schedule 22.04.2012