Для решения 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','=')),
'
')" />
</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,'=')),
'
')" />
</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
.