У меня есть память переводов, которая по существу является файлом XML на основе спецификаций формата конвертации Translation Memory, и я пытаюсь найти конкретную единицу перевода для редактирования. Это пример структуры:Найти пары единиц перевода в файле tmx
<?xml version="1.0" encoding="utf-8"?>
<tmx version="1.4">
<header creationtool="xxx" .... />
<body>
<tu tuid="1">
<tuv xml:lang="en-US">
<seg>sample source</seg>
</tuv>
<tuv xml:lang="de-DE">
<seg>sample translation</seg>
</tuv>
</tu>
<tu tuid="2">
<tuv xml:lang="en-US">
<seg>Address</seg>
</tuv>
<tuv xml:lang="de-DE">
<seg>Adresse</seg>
</tuv>
</tu>
.....
</body>
</tmx>
То, что я хочу, чтобы иметь возможность найти все единицы перевода (TU), которые имеют конкретный источник перевод и конкретный целевой перевод. Так, например, я хочу найти все единицы перевода, где значение атрибута языка xml является «en-US», а значение элемента seg - «источник выборки», а значение атрибута языка xml - «de-DE», а его значение элемента seg «образец перевода». Я хочу найти
<tu tuid="18">
<tuv xml:lang="en-AU">
<seg>sample source</seg>
</tuv>
<tuv xml:lang="de-DE">
<seg>sample translation</seg>
</tuv>
</tu>
Вполне возможно, а есть более чем один ЕП (та), что соответствует критериям - то есть, возможно, дублирует в памяти переводов.
Я попытался получить коллекцию, которую я мог бы перебирать, например.
XElement root = XElement.Load(@"sample.tmx");
IEnumerable<XElement> translationUnits =
from el in root.Elements("tu")
where
(from tuv in el.Elements("tuv")
where
(string)tuv.Attribute(XNamespace.Xml + "lang") == "en-US" &&
(string)tuv.Element("seg") == "sample source"
select tuv)
.Any()
select el;
foreach (XElement el in translationUnits)
Console.WriteLine((string)el.Attribute("tuid"));
Однако я, очевидно, делаю что-то неправильно, но я думаю, что я на правильном пути. Как только я нахожу коллекцию, я хочу обновить целевой перевод.