2013-11-27 2 views
-1

Я просмотрел весь Google и не мог понять, как это реализовать правильно. Это вообще невозможно, или мне не хватает какого-то синтаксиса? Прошло очень много времени с тех пор, как я сделал JavaScript, поэтому я могу просто пропустить что-то очень простое.xsl: call-template в функции javascript

У меня есть встроенный JavaScript для XSL-файла с использованием <xsl:text disabled-output-escaping="yes"><![CDATA[ и с использованием XML 1.0.

Так что у меня что-то вроде этого:

function seconds(s) { 
     s = s/60; 

     document.write(s + " "); 
     if (s > 2) { 
      document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minutes"/></xsl:call-template>'); 
     } 
     else { 
      document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="minute"/></xsl:call-template>'); 
     } 
    } 

Так что же происходит, что я даюсь секунд приращению «60» переменной «с». И мне нужно вычислить до минут, однако мне нужно вызвать шаблон, чтобы на самом деле напечатать строку «минута» или «минуты». Я знаю, что шаблон вызова работает в XSL. Но когда я внедряю его в JavaScript, он не показывает «минуты» или «минута». Он будет показывать только скорректированное целое число и пробел.

Как мне вставить эту строку xsl в JavaScript или это вообще возможно?

Редактировать: Так что я попробую уточнить еще кое-что. Данные в файле XML не важны. Я полагаю, что мой вопрос, для строки document.write, есть что-то не так с вложением в него кода xxl. Потому что на самом деле он не печатает все, что шаблон должен печатать (что в основном означает перевод слова «минута/минуты» на любой язык, который пользователь выбирает или по умолчанию использует английский, если язык не существует. необходимо знать, что было не так с синтаксисом с линией document.write, чтобы предотвратить отображение кода XSL. Или можно встроить его в JavaScript? Все JavaScript выполняется с помощью инкапсуляции CDATA в файле .xsl. Надеюсь, что это проясняет его более

+0

Вы пытаетесь программно писать javascript из XML-документа с помощью XSLT или пытаетесь вызвать XSLT-шаблон из Javascript? Можете ли вы включить образец XML-документа и более полный XSLT? –

+0

Добавлено больше разъяснений, надеюсь, вы сможете помочь мне проверить синтаксис или если этот тип внедрения возможен. – misterbear

+0

Вы не можете запустить одну команду XSL из Javascript. Вам нужно добавить больше кода (если есть) и действительно подумать о том, что вы пытаетесь сделать. –

ответ

2

Ваш вопрос немного запутанным, поскольку это дает впечатление, которое вы пытаетесь вызвать XSL:.. шаблон с помощью Javascript, который не возможно, но я думаю, что вы на самом деле сказать, что вы пытаетесь вызвать шаблон в XSLT как часть вывода некоторого текста, который, как оказалось, является java скрипт для последующего использования в браузере.

Причина не работает то, потому что, как вы говорите, в вашем вопросе, то Javascript текст вы outputing окружен этим ...

<xsl:text disabled-output-escaping="yes"><![CDATA[ 
    ... Javascript code here.. 
]]></xsl:text> 

В частности, использование тега CDATA означает, что XSLT обрабатывает все, что внутри него, как unparsed текст, и поэтому это не имеет значения, если у вас просто есть текст с использованием синтаксиса xslt. Он просто рассматривается как любой другой текст.

Что вы можете сделать, чтобы обойти это, это закрыть CDATA перед каждым xsl: call-template и повторно открыть его после. Что-то вроде этого

<xsl:text disable-output-escaping="yes"><![CDATA[ 
function seconds(s) { 
    s = s/60; 

    document.write(s + " "); 
    if (s > 2) { 
     document.write(s + " " + ']]></xsl:text> 
      <xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template> 
      <xsl:text disable-output-escaping="yes"><![CDATA['); 
    } 
    else { 
     document.write(s + " " + ']]></xsl:text> 
      <xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template> 
      <xsl:text disable-output-escaping="yes"><![CDATA['); 
    } 
} 
    ]]> 
    </xsl:text>  

Или, может быть, это slighty аккуратнее, чтобы избавиться от внешней XSL: текст и CDATA теги и использовать их только окружать символы, которые содержат символы «побега».

<xsl:template name="outputSeconds"> 
function seconds(s) { 
    s = s/60; 

    document.write(s + " "); 
    if (s <xsl:text disable-output-escaping="yes">&gt;</xsl:text> 2) { 
     document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minutes'"/></xsl:call-template>'); 
    } 
    else { 
     document.write(s + " " + '<xsl:call-template name="resources"><xsl:with-param name="res" select="'minute'"/></xsl:call-template>'); 
    } 
} 
</xsl:template> 

Две вещи, чтобы отметить:

1) В вашем вопросе ваш обратитесь к разделу "отключено-выход-побег", когда оно должно быть "отключение-выход-побег"

2) Где ты вызовите шаблон «resources» с параметром, если вы хотите передать строковое значение, в отличие от значения узла, приложите значение в апострофе; <xsl:with-param name="res" select="'minute'"/>

+0

Большое вам спасибо за помощь. Я не знал, что misterbear

+1

С точки зрения XSLT это не JavaScript, это всего лишь немного текста, который выводится для использования чего-то другого. Вы можете начинать и заканчивать CDATA, где вам нравится! –

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