2010-03-17 82 views
1

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

我需要更換「文件(‘’)」 XPath函數,我應該怎麼用呢? 我試圖完全刪除它,但xsl文件不適合我!

我需要如此,因爲這個問題是:

我使用的是使用了上述文件中的一些XSLT文檔,文件說一個。 所以我有文件a,其中包括上述文件(文件b)。

我使用DOC 一個從Java代碼中,我爲DOC 做高速緩存的作爲javax.xml.transform.Templates對象,以防止多次讀取到每個轉換請求XSL文件。

我發現,文檔b重新從硬盤調用自己,我相信這是因爲上面的文檔('')功能,所以我想要替換/刪除它。

謝謝。

+1

爲什麼你需要更換'文件( '')'?什麼是實際問題? – markusk 2010-03-17 22:26:59

回答

1

如果要訪問變量內的節點,通常使用node-set()擴展功能。可用性和語法取決於您使用的處理器。對於MSXML和Saxon,您可以使用exsl:node-set()。要使用擴展函數,您必須包含定義函數的名稱空間。

E.g. (MSXML室內用測試,返回美國的國家名稱= '美國'):

<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> 
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('')的變體是更具可讀性。

+0

我需要從上面的代碼做最小的更改,順便說一句,謝謝:) – 2010-03-17 22:40:17