2013-05-19 53 views
2

我想使用XSLT將XML轉換爲XHTML。我想用Python來做,但我並不特別依賴任何庫。繼the directions here,我一直想這樣的:XSLT與Python的lxml:禁止變量?

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。這是專業創建的,所以我不認爲它會有很大的問題。

有沒有辦法來覆蓋這個錯誤,以便我可以讓我的XML文件轉換爲Python?或者有沒有不同的方式來做這個XSLT,我不會一直得到錯誤?在瀏覽器(Firefox)中轉換工作正常,但我無法讓它在Python中工作。

回答

4

恐怕你的承包商讓你失望。 XSLT規範說,這在section 12.2

It is an error for the value of either the use attribute or the match attribute to contain a VariableReference.

所以在線路key元素283的editions.xsl 288是無效的XSLT,因爲他們的match屬性使用路徑一步tei:rdg[contains(@wit,$rdg)]

幸運的是,$rdg是線183定義爲'lemma'一個簡單的常數,因此,如果你改變所有六個出現這條道路一步來tei:rdg[contains(@wit,'lemma')]相反,它應該爲你的所有工作。

+0

你是怎麼找到這個錯誤的?你知道一個有用的驗證器嗎? –

+0

@MthethewWilcoxson:好的,我看着你的Python錯誤日誌,說每行283到288有一個'禁止變量'的錯誤。然後我看着文件的第283行來找到禁止變量。這似乎是你應該需要的所有驗證。 – Borodin

+0

謝謝@Borodin,我沒有注意到上面的錯誤輸出,希望你使用了一些superduper驗證器來找到它。 ;) –