Я пытаюсь проанализировать файл XML (точнее, файл перевода XLIFF) и преобразовать его в (немного другой) формат TMX.
Мой исходный файл XLIFF выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0">
<file origin="Some/Folder/proj/SomeFile.strings" source-language="en" target-language="hr" datatype="strings" product="Product BlahBlah" product-version="3.9.12" build-num="1" x-train="Blurt">
<header>
<count-group name="SomeFile.strings">
<count count-type="total" unit="word">2</count>
</count-group>
</header>
<body>
<trans-unit id="8.text" restype="string" resname=""><source>End</source><target match-quality="80" match-description="_predecessor(22) _path(0) _file(15) datatype(5) id(17) restype(6) resname(4) _reserved(11) _one-word-threshold(-25)" state="signed-off" x-match-attributes="preserved-stable" state-qualifier="exact-match" x-leverage-path="predecessor-ice">Kraj</target><note>This is a note</note></trans-unit>
</body>
</file>
<file origin="Some/Folder/proj/SomeOtherFile.strings" source-language="en" target-language="hr" datatype="strings" product="Product BlahBlah2" product-version="3.12.56" build-num="1" x-train="Blurt2">
<header>
<count-group name="SomeOtherFile.strings">
<count count-type="total" unit="word">4</count>
</count-group>
</header>
<body>
<trans-unit id="14.accessibilityLabel" restype="string" resname=""><source>return to project list</source><target match-quality="80" match-description="_predecessor(22) _path(0) _file(15) datatype(5) id(17) restype(6) resname(4) _reserved(11)" state="signed-off" x-match-attributes="preserved-stable" state-qualifier="exact-match" x-leverage-path="predecessor-ice">povratak na popis projekata</target><note>This is again a note</note></trans-unit>
</body>
</file>
(and more <file> elements continue... some with many more <trans-unit> </trans-unit> elements than these above)
</xliff>
То, что я собираюсь сделать, это немного изменить и упростить их, чтобы получить вышеперечисленное в следующем формате:
<tu>
<prop type="FileSource">SomeFile.strings</prop>
<tuv xml:lang="en">
<seg>End</seg>
</tuv>
<tuv xml:lang="hr">
<prop type="Note">This is a note</prop>
<seg>Kraj</seg>
</tuv>
</tu>
<tu>
<prop type="FileSource">SomeOtherFile.strings</prop>
<tuv xml:lang="en">
<seg>return to project list</seg>
</tuv>
<tuv xml:lang="hr">
<prop type="Note">This is again a note</prop></prop>
<seg>povratak na popis projekata</seg>
</tuv>
</tu>
Обратите внимание, что исходный файл XLIFF может иметь несколько <file origin ...>
частей, каждая из которых содержит множество элементов <trans-unit ...>
(которые являются фактическими строками из этого файла ...)
Мне удалось закодировать часть, которая дает мне части «Исходная» и «Целевая», все в порядке, но мне все еще нужны части из элементов «происхождение файла» ... где определены языки (т.е. «исходный язык» и «целевой язык», которые я затем напишу как <tuv xml:lang="en">
и <tuv xml:lang="hr">
для каждой строки), и где я могу найти соответствующую ссылку на файл строк (то есть «SomeFile.strings» и « SomeOtherFile.strings ", который будет использоваться как <prop type="FileSource">SomeFile.strings</prop>
).
В настоящее время у меня есть следующий код Python, который прекрасно извлекает необходимые элементы «source» и «target»:
#!/usr/bin/env python3
#
import sys
from lxml import etree
if len(sys.argv) < 2:
print('Wrong number of arguments:\n => You need to provide a filename for processing!')
exit()
file = sys.argv[1]
tree = etree.iterparse(file)
for action, elem in tree:
if elem.tag == "source":
print("<TransUnit>")
print("\t<Source>" + elem.text + "</Source>")
elif elem.tag == "target":
print("\t<Target>" + elem.text + "</Target>")
elif elem.tag == "note":
if elem.text is not None:
print("\t<Note>" + elem.text + "</Note>")
print("</TransUnit>")
else:
print("</TransUnit>")
else:
next
Теперь, как мне также извлечь «исходный язык» (т. Е. Значение «en»), «целевой язык» (т. Е. Значение «hr») и ссылку на файл (т. Е. «SomeFile.strings») из элементы "origin origin ...." в исходном файле XLIFF?
Кроме того, мне нужно сохранить (запомните) эту ссылку на файл, т. Е .:
<prop type="FileSource">SomeOtherFile.strings</prop>
- для всех единиц перевода (
<tu>
), которые принадлежат этому файлу (их может быть много, в отличие от приведенного выше примера, где в каждом «файле» есть только один
Так, например, у меня будет:
<tu>
<prop type="FileSource">SomeFile.strings</prop>
<tuv xml:lang="en">
<seg>End</seg>
</tuv>
<tuv xml:lang="hr">
<prop type="Note">This is a note</prop>
<seg>Kraj</seg>
</tuv>
</tu>
<tu>
<prop type="FileSource">SomeFile.strings</prop>
<tuv xml:lang="en">
<seg>Start</seg>
</tuv>
<tuv xml:lang="hr">
<prop type="Note">This is a note</prop>
<seg>Početak</seg>
</tuv>
</tu>
- , где каждый элемент
<tu>
имеет элемент <prop type="FileSource">
, показывающий, из какого файла он пришел ...
Я был бы более чем признателен за любую помощь в этом отношении ...