【问题标题】:Created file contains all the results python lxml创建的文件包含所有结果 python lxml
【发布时间】:2013-07-24 05:29:32
【问题描述】:

我目前在 python 中使用 lxml 进行 XSLT 转换。转换后,我必须将内容写入不同的文件。为了更好地理解我的代码如下:

    ##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)

以下代码工作得很好,但是当我调用函数来创建文件并将结果写入其中时,它会将整个结果写入文件而不是结果的循环部分。

例如:如果我在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...

【问题讨论】:

    标签: python xslt python-2.7 lxml dir


    【解决方案1】:

    我认为问题在于您在循环的每次迭代中将整个文件加载到结果中。对当前迭代的唯一引用是分配文件名时:

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

    除了这个 'each_slide' 之外,不会在任何地方引用来获取文档的子集而不是整个内容。

    【讨论】:

    • 那是真的......我发现如果我们不定义任何结构,lxml.xslt 将立即完成整个文件转换,所以我得到每个文件的全部结果......解决方案将使用
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2017-09-27
    相关资源
    最近更新 更多