XSLT: необходимо заменить документ ('') - PullRequest
1 голос
/ 18 марта 2010

У меня есть следующий 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 ).

Я использую doc a из кода Java, я делаю Caching for doc a в качестве объекта javax.xml.transform.Templates, чтобы предотвратить многократное чтение файла xsl на каждый запрос на преобразование.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2010

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

например. (протестировано с 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>
1 голос
/ 18 марта 2010

Если вы пытаетесь заставить шаблон 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(''), более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...