2010-03-17 4 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).

Я использую док из кода Java, я сделать кэширование для дока в как объект по javax.xml.transform.Templates для предотвращения многократного чтения в файл XSL по требованию каждого преобразования.

Я обнаружил, что doc b перезаписывает себя из жесткого диска, я считаю, что это из-за функции документа ('') выше, поэтому я хочу ее заменить или удалить.

Спасибо.

+1

Почему вам нужно заменить 'документ ('')'? В чем проблема? – markusk

ответ

1

Если вы хотите получить доступ к узлам внутри переменной, вы обычно используете функцию расширения node-set(). Доступность и синтаксис зависят от используемого вами процессора. Для MSXML и Saxon вы можете использовать exsl:node-set(). Чтобы использовать функцию расширения, вам нужно будет включить пространство имен, определяющее функцию.

E.g. (Проверено Wiht MSXML, возвращается в США для 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

Если вы пытаетесь сделать 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

Мне нужно сделать минимальные изменения от кода выше, BTW, спасибо :) –

Смежные вопросы