2010-03-17 5 views
1

J'ai le fichier xslt suivant:XSLT: nécessité de remplacer le document ('')

<?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> 

Je dois remplacer le "document ('')" fonction XPath, que dois-je utiliser à la place? J'ai essayé de le supprimer complètement mais le document xsl ne fonctionne pas pour moi!

J'ai besoin de la parce que le problème est:

J'utilise un document XSLT qui utilise le fichier ci-dessus, par exemple le document un. J'ai donc le document un qui inclut le fichier ci-dessus (document b).

J'utilise doc un à partir du code java, je suis pour faire doc Mise en cache un comme un objet javax.xml.transform.Templates pour empêcher plusieurs lectures du fichier xsl à chaque demande de transformation.

J'ai trouvé que le document b se réécrit depuis le disque dur, je crois que c'est à cause de la fonction document ('') ci-dessus, donc je veux le remplacer/l'enlever.

Merci.

+1

Pourquoi avez-vous besoin de remplacer 'document ('')'? Quel est le problème réel? – markusk

Répondre

1

Si vous souhaitez accéder aux nœuds d'une variable, vous utilisez normalement la fonction d'extension node-set(). La disponibilité et la syntaxe dépendent du processeur que vous utilisez. Pour MSXML et Saxon, vous pouvez utiliser exsl:node-set(). Pour utiliser la fonction d'extension, vous devez inclure l'espace de noms qui définit la fonction.

E.g. (Testé wiht MSXML, États-Unis retourne pour 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> 
1

Si vous essayez de faire fonctionner le modèle IsUSDomesticCountry sans utiliser document(''), vous pouvez réécrire le modèle à

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

ou

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

ou même

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

Personnellement , Je trouve la variante utilisant document('') plus lisible.

+0

J'ai besoin de faire les changements minimes du code ci-dessus, BTW, merci :) –

Questions connexes