XSLT:需要替换文档('')

时间:2010-03-17 22:22:14

标签: xslt

我有以下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>

感谢。

2 个答案:

答案 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>