我有一个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
我想使用此站点密钥代替在xsl中指定url值,即 http://testsite.com/services/testService/v1.0 。这样做的原因是此链接会根据不同的环境而变化。
这可能吗? 如果可能,请提供您的建议或示例代码......如果这是不可能的......有没有解决办法?
答案 0 :(得分: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文件可以创作的许多不同方式。
我相信亚历杭德罗或迪米特里可能会多次改善这一点。
答案 1 :(得分:6)
对于XSLT 1.0解决方案,您可以在XML文件中使用external (parsed) general entity,该文件将属性文件作为XML内容的一部分加载。
例如,如果您有一个这样的属性文件,名为site.properties
:
foo=x
site=http://testsite.com/services/testService/v1.0
bar=y
您可以创建一个名为properties.xml
的简单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安全”时才有效。 如果要包含字符,例如&
或<
加载properties.xml
文件时会导致XML解析错误。