2010-04-14 3 views
2

Я разрабатываю веб-приложение для Firefox, в котором есть кнопка, которая запускает XSLT-преобразование на стороне клиента DOM с таблицей стилей, полученной с помощью AJAX.Доступ к значению входного элемента с XPath в XSLT

Вот часть XHTML, который будет преобразован:

<html> 
<head> 
    <title>Static Javascript-based XMR Form Creator</title> 
</head> 
<body> 
    <h1 id="title">Static Javascript-based XMR Form Creator</h1> 

    <div class="opt_block" id="main_opts"> 
     Form name <input type="text" id="form_name" /> 
     Form cols <input type="text" id="form_cols" size="3" maxlength="3" /> 
    </div> 
    <button id="generate">Generate source</button> 
    <textarea rows="20" cols="50" id="xmr_source" ></textarea> 
</body> 

Внутри таблицы стилей, я хочу, чтобы получить доступ к атрибуту первого поля ввода value, один с идентификатором form_name.

XSLT выглядит следующим образом:

<xsl:template match="/html/body/div[@id = 'main_opts']" > 
    <form> 
     <xsl:attribute name="fname"> 
      <xsl:value-of select="input[@id = 'form_name']/@value" /> 
     </xsl:attribute> 
    </form> 
</xsl:template> 

я применяю XSLT на текущегоdocument, например, так:

var processor = new XSLTProcessor(); 
processor.importStylesheet(data); // data received via AJAX request 
// document is obviously the object representing the current DOM 
var result = processor.transformToDocument(document); 

Проблема заключается в том, что XPath, которые должны выполнять работу:

<xsl:value-of select="input[@id = 'form_name']/@value" /> 

ничего не возвращает, Просматривая DOM через Firebug, свойство input имеет значение value.

Может ли кто-нибудь помочь?

EDIT: ясно, что XSLT применяется к текущему документу

+0

Означает ли это, что вы добавляете значение формы вручную (потому что вход, который вы показываете, не имеет)? – Tomalak

+0

это может показаться хакерским, но нет элемента формы. Я использую только элементы 'input' и' textarea' для того, что они делают, даже не отправляя форму. – asymmetric

+0

Если вы попытаетесь получить значение атрибута «type», это сработает? (Я хочу исключить возможность того, что вы видите странность в пространстве имен, поскольку ваш XSLT не использует стандартное пространство имен html, тогда как ваш HTML-код, который не является действительным XHTML, может набирать где-то.) –

ответ

1

попытка ссылки на ввод с косой чертой или точка точка хлестать

<xsl:value-of select="/input[@id = 'form_name']/@value" /> 
<xsl:value-of select="../input[@id = 'form_name']/@value" /> 
+0

Извините, но это не похоже на проблему – asymmetric

1

Одна из очевидных проблем:

<xsl:value-of select="input[@id = 'form_name']/@value" /> 

Это должно выдавать значение @value attr ibute дочернего узла input.

Однако, в предоставленном документе XML, то input потомок элемента, совпавший с шаблоном, не имеют @value атрибута:

Form name <input type="text" id="form_name" /> 

только два атрибута эти input элемента являются type и id.

Решение: Добавьте атрибут value к входному элементу и (учитывая все остальное в коде XSLT работают КИ), значение этого атрибута должно быть выведено.

Для примера использования:

Form name <input type="text" id="form_name" value="XXXXX" /> 
+0

Но атрибут 'value' элемента' input' указывает его значение * initial *. Я, OTOH, хочу получить его текущий. Если я запрашиваю DOM для всего элемента 'input', а не только его' @ value', в Javascript, а затем получает его свойство value, все работает, а это означает, что представление DOM этого элемента * делает * значение в свойстве 'value'. Так почему же он не работает с чистым XPath? – asymmetric

+0

Кроме того, если я делаю, как вы говорите, все, что я получаю, это начальное значение элемента input, а не текущее. – asymmetric

+0

@asymmetric: XPath ничего не знает о том, как браузер обрабатывает HTML DOM. То, что вы хотите, не может быть достигнуто путем оценки выражения XPath, если только текущий XML-документ (DOM) не предоставлен движку XPath. –

1

Это хак, но я использую его, и он работает

Добавить

onBlur="this.setAttribute('value', this.value);" 

к каждому входному элементу.

Вы можете использовать любое событие, которое хотите, но onBlur приятно, так как оно не создает слишком много накладных расходов на стороне клиента.

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