2013-07-24 1 views
1

В настоящее время я использую lxml для преобразования XSLT в python. После трансформации мне приходится писать контент в разные файлы. Для лучшего понимания мой код здесь следующим образом:Созданный файл содержит все результаты python lxml

##function to create a new file and write the result into the file 
    def new_file(a,b): 
     full_path = 'path of teh folder to create the file'+a 
     file_new = open(full_path, 'w') 
     file_new.write(b) 


    if xmlRoot.xpath('//slide[@nav_lvl_1="x" and @nav_lvl_2="y"]'): 

     ##xpath to get the all the selected nodes of the attributes x and y 
     slide_list = xmlRoot.xpath('//slide[@nav_lvl_1="x" and @nav_lvl_2="y"]') 

     ##loop against the obtained list of node element 
     for each_slide in slide_list: 
      xslRoot = etree.parse('path of xsl_file') 
      transform = etree.XSLT(xslRoot) 
      newdom = transform(xmlRoot) 
      file_name = ('slide'+each_slide.get('page_number')+'.xml') 
      result = etree.tostring(newdom, pretty_print=True) 
      print etree.tostring(newdom, pretty_print=True) 
      new_file(file_name , result) 

Следующий код работает абсолютно нормально, но, когда я вызываю функцию, чтобы создать файл и записать результат в него, он записывает весь результат в файл вместо ofloop часть результата.

Например: если у меня есть пять элементов узла в slide_list, тогда файл xslRoot преобразуется пять раз для разных значений. И для каждого преобразования я должен написать результат в пяти разных файлах. Когда я запускаю этот код, у меня есть все пять преобразованных результатов во всех пяти созданных файлах, где мне нужен только один результат для каждого файла.

Какая ошибка я сделал. НЕТ не удалось выяснить. какие-либо предложения?

вход Xml будет:

- <slide add_info="Merchandising" name="slide8.xml" nav_lvl_1="x" nav_lvl_2="y" page_number="8"> 
    and .... 

- <slide add_info="Merchandising" name="slide8.xml" nav_lvl_1="x" nav_lvl_2="y" page_number="9"> 
    and ... 

- <slide add_info="Merchandising" name="slide8.xml" nav_lvl_1="x" nav_lvl_2="y" page_number="10"> 
    and ... 

- <slide add_info="Merchandising" name="slide8.xml" nav_lvl_1="x" nav_lvl_2="y" page_number="11"> 

    and so on... 

ответ

2

Я думаю, что проблема в том, что вы загружаете файл целиком в результате на каждой итерации цикла. Единственная ссылка на текущей итерации, когда вы назначаете имя файла:

file_name = ('slide'+each_slide.get('page_number')+'.xml') 

кроме этого «each_slide» не называют в любом месте, чтобы получить подмножество документа, а не все это.

+0

Thats very true ... Я узнал, что lxml.xslt выполнит преобразование всего файла сразу, если мы не определим какую-либо структуру, поэтому я получаю весь результат по каждому файлу ... Решение будет использовать