1

私はlxmlXML/XSL ドキュメントを処理するために Python で使用し始めていますが、一般的には非常に簡単です。ただし、翻訳時に XML フラグメントをスタイルシート パラメータとして渡す方法が見つかりません。

たとえば、PHP ではDOMDocumentXML フラグメントをスタイルシート パラメータとして渡すことができるため、スタイルシート内で複雑なパラメータを使用できます。

$xml = new DOMDocument();
$xml->loadXML('<root><node/></root>');

$xsl = new DOMDocument();
$xsl->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" omit-xml-declaration="yes" 
    indent="yes" media-type="text/html" />
<xsl:param name="a" />

<xsl:template match="/">
<html>
  <body>
    <xsl:value-of select="$a/foo/bar/text()" />
  </body>
</html>
</xsl:template>

</xsl:stylesheet>');

$fragment = new DOMDocument();
$fragment->loadXML('<foo><bar>baz</bar></foo>');

$proc = new XSLTProcessor;
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsl);

$param_ns = '';
$param_name = 'a';
$proc->setParameter($param_ns, $param_name, $fragment->documentElement);

結果は次のようになります。

<html>
  <body>
  baz
  </body>
</html>

を使用してこれをどのように達成しlxmlますか?

4

3 に答える 3

1

私の知る限り、lxml では xpath 式 (または引用符付きの文字列の場合は etree.XSLT.strparam() メソッドの結果) のみを使用できます (現時点ではとにかく)。

ただし、xpath 式を使用できるため、問題の Element を返すカスタム xpath 拡張関数を使用して「回避」できることを意味します。もう 1 つの方法は、標準の xpath document() 関数を利用し、カスタム リゾルバーを使用することです。

于 2009-11-18T16:56:46.623 に答える
1

Python 拡張関数を使用して、etree.XML ドキュメントを xslt に返すことができます。これが最低限の例です。グローバル名前空間 (uri:params) を登録し、関数をその名前空間の「params」メソッドに関連付けます。これは、拡張機能に到達するためにスタイルシートによって使用されます。スタイルシートの xmlns:ptest 宣言を忘れないでください。

うーん、このコードで < 記号を表すために html エンティティを配置する必要があるようです。http://bkc.pastebin.com/f67461cccにも入れました


from lxml import etree

stylesheet = etree.XML("""
    <xsl:stylesheet version="1.0"
         xmlns:ptest="uri:params"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:variable name="params" select="ptest:params()" />
         <xsl:template match="/">
             <name_is><xsl:value-of select="$params/name" /></name_is>
         </xsl:template>
     </xsl:stylesheet>
""")

def params(context):
    # this is the extension function, it returns
    # a etree.XML document
    return etree.XML(
        """<params>
                <name>fred
        </params>"""
        )


def test():
    """test passing document to xslt via python extension function

    >>> test()
    <?xml version="1.0"?>
    <name_is xmlns:ptest="uri:params">fred
    <BLANKLINE>
    """    
    ns = etree.FunctionNamespace('uri:params') # register global namespace
    ns['params'] = params # define function in new global namespace
    transform = etree.XSLT(stylesheet)
    print str(transform(etree.XML("""<source />""")))

if __name__ == "__main__":
    import doctest
    doctest.testmod()
于 2010-01-03T01:51:30.383 に答える
0

あなたが探しているものは、lxml.etree.XSLTを使用して実行できると思います。XPath と XSLT with lxmlについて説明しているページのXSLT セクションに良い例があります。

于 2009-11-18T21:16:09.117 に答える