2014-12-02 2 views
0

У меня есть XML-файл, что я хочу, чтобы преобразовать с Saxon-CE XSLT 2.0 Процессор:XSLT 2.0 перебираем массив выбора элементов по атрибуту

<books> 
    <book name="book1"> 
    <book name="book2"> 
    <book name="book3"> 
</books> 

Я хочу, чтобы фильтровать этот XML-файл с помощью массива. Этот массив является результатом выбранных флажков веб-страницы и передается в XSLT с setParameter:

$("input:checkbox[id='books']").each(function() {   
    books.push($(this).val()); 
    }); 

//books: ["book1", "book2"] 

xslt = Saxon.requestXML("xsltfile.xsl"); 
xml = Saxon.requestXML("xmlfile.xml"); 
var xsltProc = Saxon.newXSLT20Processor(xslt); 
xsltProc.setParameter(null, "books", books); 

Теперь я хочу, чтобы выбрать все книги, где имя встречается в массиве.

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="books"></xsl:param> 
<xsl:variable name="mybooks" select="/books/book[@name=$param[1]]"/>  
</xsl:stylesheet> 

Как я могу цикл по массиву и выбирать только книги с именем массива?

+0

Вы отредактировали образец и использовали имя правого параметра в справочной '$ books', но мне интересно, почему вы сравниваете только $ book [1]', если вы хотите фильтровать на основе всех элементов в вашем массиве. –

+0

Я узнал ошибку, когда прочитал вопрос. Я изменил его, чтобы сохранить правильный ответ :) спасибо! –

ответ

1

В случае

<xsl:param name="books"></xsl:param> 
<xsl:variable name="mybooks" select="/books/book[@name=$param]"/> 

вы должны

<xsl:param name="books"></xsl:param> 
<xsl:variable name="mybooks" select="/books/book[@name=$books]"/> 

Кроме того, я не вижу ничего плохого в вашем коде и в соответствии с http://saxonica.com/ce/user-doc/1.1/index.html#!api/xslt20processor/setParameter значение параметра может быть массивом Javascript, так надеемся, что взаимодействие между Javascript и XSLT работает.

+0

Ох спасибо, в этом была проблема! –