1

引数リストの解凍について少し混乱しています。プログラムでXSL-FOファイルを作成しようとしているため、ファイルのある時点で可変数の要素を挿入する必要があります。もちろん、これは他の方法(XML / XSLT、他のXMLメソッドなど)でも実行できますが、Pythonの基本的な知識が少し錆びているため、これが機能しない理由を知りたいと思います。「RIGHTHERE」のすぐそばで、column_elmsリストを可変数のパラメーターとして挿入しようとしています。これはリストを取得しないことに注意してください。次の行にあるものをコピーするE("table-column...),と(実際には、何度も繰り返して目的の出力が生成されます(複数のtable-column要素。ただし、これを解凍すると、table-column関係なく1つの要素が得られます)。何が起こっているのか‽‽‽</p>

from lxml.builder import ElementMaker
from lxml import etree as ET  
COLUMNS = 8
E = ElementMaker(namespace='http://www.w3.org/1999/XSL/Format',
                 nsmap={'fo':"http://www.w3.org/1999/XSL/Format"})
column_elms = [E("table-column",{"column-width":"41mm"})] * COLUMNS
root = E("root",
         E("layout-master-set",
           E("simple-page-master",
             {"master-name":"label-sheet",
                "margin-left":"5mm",
                "margin-right":"5mm",
                "margin-top":"14mm",
                "margin-bottom":"14mm"},
             E("region-body"))),
         E("page-sequence",
           {"master-reference":"label-sheet"},
             E("flow", {"flow-name":"xsl-region-body"},
                E("table", *column_elms # **RIGHT HERE**
                                        # E("table-column",{"column-width":"41mm"}),
                    ))))
4

1 に答える 1

1

同じオブジェクトCOLUMNSのコピーを含むリストを作成しています:

column_elms = [E("table-column",{"column-width":"41mm"})] * COLUMNS

上記のコードはE()8 回呼び出すのではなく、1 回呼び出してから8つの参照をリストに入れます。

それはあなたが走ったかのようです:

column_elms = []
tcolumn = E("table-column",{"column-width":"41mm"})
for i in range(COLUMNS):
    column_elms.append(tcolumn)

代わりにリスト内包表記を使用してください。

column_elms = [E("table-column",{"column-width":"41mm"}) for _ in xrange(COLUMNS)]

E(..)これは、ループを実行するたびに式を評価します。

于 2013-02-07T17:44:51.777 に答える