我有以下xslt文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- USDomesticCountryList - USE UPPERCASE LETTERS ONLY -->
<xsl:variable name="USDomesticCountryList">
<entry name="US"/>
<entry name="UK"/>
<entry name="EG"/>
</xsl:variable>
<!--// USDomesticCountryList -->
<xsl:template name="IsUSDomesticCountry">
<xsl:param name="countryParam"/>
<xsl:variable name="country" select="normalize-space($countryParam)"/>
<xsl:value-of select="normalize-space(document('')//xsl:variable[@name='USDomesticCountryList']/entry[@name=$country]/@name)"/>
</xsl:template>
</xsl:stylesheet>
我需要替换“document('')”xpath函数,我应该使用什么呢? 我试图完全删除它,但xsl文档对我不起作用!
我需要这样做,因为问题是:
我正在使用一些使用上述文件的XSLT文档,比如文档 a 。 所以我的文档 a 包含上述文件(文档 b )。
我正在使用java代码中的doc a ,我正在将doc a 缓存为javax.xml.transform.Templates对象,以防止对xsl进行多次读取在每个转换请求上提交文件。
我发现,doc b 正在从硬盘重新调用自己,我相信这是因为上面的文档('')函数,所以我想替换/删除它。 / p>
感谢。
答案 0 :(得分:1)
如果您尝试在不使用IsUSDomesticCountry
的情况下使document('')
模板正常工作,则可以将模板重写为
<xsl:template name="IsUSDomesticCountry">
<xsl:param name="countryParam"/>
<xsl:variable name="country" select="normalize-space($countryParam)"/>
<xsl:choose>
<xsl:when test="$country='US'">true</xsl:when>
<xsl:when test="$country='UK'">true</xsl:when>
<xsl:when test="$country='EG'">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:template>
或
<xsl:template name="IsUSDomesticCountry">
<xsl:param name="countryParam"/>
<xsl:variable name="country" select="normalize-space($countryParam)"/>
<xsl:value-of select="$country='US' or $country='UK' or $country='EG'"/>
</xsl:template>
甚至
<xsl:template name="IsUSDomesticCountry">
<xsl:param name="countryParam"/>
<xsl:variable name="country"
select="concat('-', normalize-space($countryParam),'-')"/>
<xsl:variable name="domesticCountries" select="'-US-UK-EG-'"/>
<xsl:value-of select="contains($domesticCountries, $country)"/>
</xsl:template>
就个人而言,我发现使用document('')
的变体更具可读性。
答案 1 :(得分:1)
如果要访问变量内的节点,通常使用node-set()
扩展功能。可用性和语法取决于您使用的处理器。对于MSXML和Saxon,您可以使用exsl:node-set()。要使用扩展功能,您必须包含定义该功能的命名空间。
E.g。 (使用MSXML测试,返回US为countryName ='US'):
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
>
<xsl:output method="xml"/>
<!-- USDomesticCountryList - USE UPPERCASE LETTERS ONLY -->
<xsl:variable name="USDomesticCountryList">
<entry name="US"/>
<entry name="UK"/>
<entry name="EG"/>
</xsl:variable>
<!--// USDomesticCountryList -->
<xsl:template name="IsUSDomesticCountry">
<xsl:param name="countryParam"/>
<xsl:variable name="country" select="normalize-space($countryParam)"/>
<xsl:value-of select="exsl:node-set($USDomesticCountryList)/entry[@name=$country]/@name"/>
</xsl:template>
</xsl:stylesheet>