У меня есть входная строка в формате html, которую необходимо проанализировать и записать в XML, совместимый с DITA.
Вход:
<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>
Желаемый результат:
<p>Line with following newline<?linebreak?>Line with two following newlines<?linebreak?><?linebreak?>Line with no following newline</p>
package require tdom
set xml {<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>}
puts "Input:"
puts "$xml"
set doc [dom parse -html -keepEmpties $xml]
set root [$doc documentElement]
foreach node [$root getElementsByTagName br] {
$node delete
#$node appendXML "<?linebreak?>"
}
puts "Output:"
puts [$doc asXML -indent none]
Если я раскомментирую #$node appendXML "<?linebreak?>"
, скрипт завершится неудачно. Я новичок в tdom, но не в tcl. Или....может быть, у кого-то есть другое представление о том, как сохранить разрывы строк в XML, особенно в DITA.
Как только вы вызываете delete
на узле tdom, он больше не существует, поэтому, естественно, вы получите ошибку, если попытаетесь использовать его позже.
Один из подходов: для каждого узла br
создайте новый узел инструкций обработки, а затем замените им узел br
(для этого сначала необходимо получить родительский узел узла). Тогда ваш цикл будет выглядеть так:
foreach node [$root getElementsByTagName br] {
set lb [$doc createProcessingInstruction linebreak ""]
[$node parentNode] replaceChild $lb $node
# replaceChild moves the old node to the document fragment list;
# just get rid of it completely since we're not going to reuse it
$node delete
}
и модифицированная программа распечатает
Input:
<p>Line with following newline<br>Line with two following newlines<br><br>Line with no following newline</p>
Output:
<html><p>Line with following newline<?linebreak ?>Line with two following newlines<?linebreak ?><?linebreak ?>Line with no following newline</p></html>
Ах... идеально! Это имеет смысл, включая использование createProcessingInstruction. Спасибо за вашу помощь.
Если вы планируете позже перевести свой дита-контент, я рекомендую протестировать обработку PI разрыва строки вашим инструментом CAT/TM.