使用Python的XSLT';s lxml:禁止变量?

使用Python的XSLT';s lxml:禁止变量?,python,xml,xslt,lxml,Python,Xml,Xslt,Lxml,我正在尝试使用XSLT将XML转换为XHTML。我希望使用Python来实现这一点,但我并不特别喜欢任何库。以下是我一直在尝试的: 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 <modu

我正在尝试使用XSLT将XML转换为XHTML。我希望使用Python来实现这一点,但我并不特别喜欢任何库。以下是我一直在尝试的:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“xslt.pxi”,第406行,在lxml.etree.xslt._uinit__;中(src/lxml/lxml.etree.c:136874)
lxml.etree.XSLTParseError:禁止变量
我还尝试使用,它使用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'
禁止变量
编译错误:file editions.xsl第283行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#folger'].//tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.\folger']
禁止变量
编译错误:file editions.xsl第284行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#folger'].//tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.\folger']
禁止变量
编译错误:file editions.xsl第285行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#texta'].//tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.'texta']'
禁止变量
编译错误:file editions.xsl第286行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#texta'].//tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.'texta']'
禁止变量
编译错误:file editions.xsl第287行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#textb'].\124;/tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.\textb']
禁止变量
编译错误:file editions.xsl第288行元素键
xsl:key:'match'模式编译失败'//tei:div/tei:ab/tei:ptr[@type='edmension'][@ana='#textb'].\124;/tei:rdg[contains(@wit,$rdg)]/tei:ptr[@type='edmension'][@ana='.\textb']
回溯(最近一次呼叫最后一次):
文件“transform.py”,第21行,在
结果=style.applyStylesheet(文档,无)
AttributeError:“非类型”对象没有属性“applyStylesheet”
我使用的XSL文件是。它是专业制作的,所以我认为不会有大问题


有没有办法覆盖这个错误,这样我就可以用python转换XML文件?还是有一种不同的方法来实现XSLT,这样我就不会一直出错?在浏览器(Firefox)中进行转换很好,但我无法在Python中进行转换

恐怕你的承包商让你失望了。XSLT规范在以下方面说明了这一点:

use属性或match属性的值包含VariableReference是错误的

因此,
editions.xsl
的第283到288行中的
元素是无效的XSLT,因为它们的
匹配
属性使用路径步骤
tei:rdg[contains(@wit,$rdg)]


幸运的是,
$rdg
是一个简单的常量,在第183行定义为
'lemma'
,因此如果您将此路径步骤的所有六个匹配项都更改为
tei:rdg[contains(@wit,'lemma')]
,那么它应该对您都有效。

恐怕您的承包商让您失望了。XSLT规范在以下方面说明了这一点:

use属性或match属性的值包含VariableReference是错误的

因此,
editions.xsl
的第283到288行中的
元素是无效的XSLT,因为它们的
匹配
属性使用路径步骤
tei:rdg[contains(@wit,$rdg)]


幸运的是,
$rdg
是一个简单的常量,在第183行定义为
'lemma'
,因此,如果您将此路径步骤的所有六个匹配项都更改为
tei:rdg[contains(@wit,'lemma')]
,那么它应该都适用于您。

您是如何发现该错误的?你知道一个有用的验证器吗?@MatthewWilcoxson:我看了你的Python错误日志,上面说在283到288行的每一行都有一个
禁止变量
错误。然后我查看了文件的第283行,以找到禁止的变量。这似乎是您需要的所有验证。谢谢@Borodin,我没有注意到上面的错误输出,希望您使用superduper验证器找到它。;)你是怎么发现那个错误的?你知道一个有用的验证器吗?@MatthewWilcoxson:我看了你的Python错误日志,上面说在283到288行的每一行都有一个
禁止变量
错误。然后我查看了文件的第283行,以找到禁止的变量。这似乎是您需要的所有验证。谢谢@Borodin,我没有注意到上面的错误输出,希望您使用superduper验证器找到它。;)