2013-05-19 2 views
2

Я пытаюсь преобразовать XML в XHTML с помощью XSLT. Я бы хотел сделать это с помощью Python, но я не привязан к какой-либо библиотеке. После the directions here, я пытался это:XSLT с lxml для 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 

Я также попытался с помощью 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 по 288 из editions.xsl не действуют XSLT, потому что их match атрибуты используют шаг пути tei:rdg[contains(@wit,$rdg)].

К счастью, $rdg простая константа, определенная в строке 183, чтобы быть 'lemma', так что если вы измените все шесть вхождений этого шага пути к tei:rdg[contains(@wit,'lemma')] вместо этого, это все должно работать для вас.

+0

Как вы нашли эту ошибку? Вы знаете полезный валидатор? –

+0

@MatthewWilcoxson: Хорошо, я посмотрел ваш журнал ошибок Python, в котором говорится, что в каждой строке от 283 до 288. есть ошибка «Запрещенная переменная». Затем я просмотрел строку 283 файла, чтобы найти запрещенную переменную. Кажется, это все, что вам нужно. – Borodin

+0

Спасибо @Borodin, я не заметил вывод ошибки выше, надеялся, что вы использовали какой-то супердатчик для его поиска. ;) –

 Смежные вопросы

  • Нет связанных вопросов^_^