XSLT与Python的lxml:禁止变量?

时间:2013-05-19 19:21:51

标签: python xml xslt lxml

我正在尝试使用XSLT将XML转换为XHTML。我想用Python做,但我并不特别依赖任何库。关注the directions here,我一直在尝试这个:

from lxml import etree

xslt_root=etree.parse('editions.xsl')
transform=etree.XSLT(xslt_root)

但是我收到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "xslt.pxi", line 406, in lxml.etree.XSLT.__init__ (src/lxml/lxml.etree.c:136874)
lxml.etree.XSLTParseError: Forbidden variable

我也尝试使用this python script,它使用libxslt,但它给了我这些错误:

    Forbidden variable
compilation error: file editions.xsl line 283 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#folger'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#folger']'
Forbidden variable
compilation error: file editions.xsl line 284 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#folger'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#folger']'
Forbidden variable
compilation error: file editions.xsl line 285 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#texta'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#texta']'
Forbidden variable
compilation error: file editions.xsl line 286 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#texta'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#texta']'
Forbidden variable
compilation error: file editions.xsl line 287 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#textb'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#textb']'
Forbidden variable
compilation error: file editions.xsl line 288 element key
xsl:key : 'match' pattern compilation failed '//tei:div/tei:ab/tei:ptr[@type='emendation'][@ana='#textb'] |// tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='emendation'][@ana='#textb']'
Traceback (most recent call last):
  File "transform.py", line 21, in <module>
    result = style.applyStylesheet(doc, None)
AttributeError: 'NoneType' object has no attribute 'applyStylesheet'

我使用的XSL文件是here。它是专业创建的,所以我不认为它会有很大的问题。

有没有办法覆盖此错误,以便我可以在Python中获取我的XML文件进行转换?或者有没有不同的方法来做这个XSLT,我不会一直得到错误?在浏览器中进行转换(Firefox)工作正常,但我无法在Python中使用它。

1 个答案:

答案 0 :(得分:4)

我担心你的承包商会让你失望。 XSLT规范在section 12.2中说明了这一点:

  

use属性或match属性的值包含VariableReference时出错。

因此,key第283行至第288行中的editions.xsl元素无效XSLT,因为其match属性使用路径步骤tei:rdg[contains(@wit,$rdg)]

幸运的是,$rdg是在第183行定义为'lemma'的简单常量,因此如果您将此路径步骤的所有六次出现更改为tei:rdg[contains(@wit,'lemma')],那么它应该全部工作你。