2009-11-18 3 views
0

XML/XSL 문서를 처리하기 위해 Python에서 lxml을 사용하기 시작했습니다. 일반적으로 매우 직설적 인 것처럼 보입니다. 그러나 번역을 할 때 XML 조각을 스타일 시트 매개 변수로 전달하는 방법을 찾을 수 없습니다.lxml을 사용하여 XML 조각을 스타일 시트 매개 변수로 전달 하시겠습니까?

예를 들어, PHP에서 하나는 스타일 시트에서 사용할 수있는 복합 PARAMS을 가질 수 있도록, 스타일 파라미터로서 DOMDocument XML 단편을 전달하는 것이 가능하다 :

$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을 사용하면 어떻게합니까?

답변

1

내가 아는 한 lxml (현재는 어쨌든)에 xpath 표현식 (또는 따옴표가있는 문자열에 etree.XSLT.strparam() 메소드의 결과) 만 사용할 수 있습니다.

그러나 xpath 표현식을 사용할 수 있으므로 해당 요소를 반환하는 custom xpath extension function을 사용하여 "해결할 수 있음"을 의미합니다. 또 다른 방법은 표준 xpath document() 함수를 사용하는 것입니다. custom resolver

+0

고마워. 게시물을 편집하고 사용자 정의 해결 프로그램을 사용하여 페이지 링크를 변경할 수 있습니까? 게시 후에 커스텀 xpath 함수를 알아 차리고 같은 결론을 얻었지만'document()'메소드가 더 유용 할 수 있습니다. –

+0

@Steven의 포인트가 너무 많아서 여러 링크를 게시 할 수 없었기 때문에이 답변은 특별합니다. 그는 지금 약 12k 점이 있습니다. 긴 길. – mlissner

+0

@mlissner : 나에게 상기시켜 줘서 고마워 ;-), 나는 링크를 고쳤다. – Steven

0

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() 
관련 문제