У меня есть большое количество документов HTML (и, возможно, других XML), которые мне нужно отредактировать.
Редакции обычно имеют вид «Джон Доу» -> «[Человек А]». Редактируемый текст может быть в заголовках или абзацах, но почти всегда будет в абзацах.
Простые замены строк на самом деле. Не очень сложные вещи.
Однако я хочу сохранить структуру документа, и я бы предпочел не изобретать велосипеды. Подстановка строк в тексте документа может помочь, но также может нарушить структуру документа, поэтому это будет последний вариант.
Прямо сейчас я смотрел на XSLT в течение часа и пытался заставить "str:replace" выполнять мои приказы. Я избавлю вас от просмотра моих слабых попыток, которые не сработали, но я спрошу: есть ли простой и известный способ применить мои правки с помощью XSLT, и не могли бы вы опубликовать его здесь?
Заранее спасибо.
Обновление: по просьбе Мартина Хоннена я добавляю свои входные файлы, а также команду, которую использовал для получения последнего сообщения об ошибке. Из этого будет видно, что я полный ноль, когда дело доходит до XSLT :-)
.html файл:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>TodaysDate</title> <meta name="created" content="2020-11-04T30:45:00"/> </head> <body> <ol start="2"> <li><p> John Doe on 9. fux 2057 together with Henry Fluebottom formed the company Doe &; Fluebottom Widgets Inc. </p> </ol> </body> </html>
Файл преобразования XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:template match="p">
<xsl:copy>
<xsl:attribute name="matchesPattern">
<xsl:copy-of select='str:replace("John Doe", ".*", "[Person A]")'/>
</xsl:attribute>
<xsl:copy-of select='str:replace("Henry Fluebottom", ".*", "[Person B]")'/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Команда и вывод:
$ xsltproc -html transform.xsl example.html
xmlXPathCompOpEval: function replace bound to undefined prefix str
xmlXPathCompiledEval: 2 objects left on the stack.
<?xml version="1.0"?>
TodaysDate
<p matchesPattern=""/>
$
str:replace
(в XSLT 1 с EXSLT) илиreplace
в XSLT 2 и более поздних версиях не выполняет эту работу за вас, если только каждая строка, которую вы хотите заменить, не содержится в одном текстовом узле (например,<p>John Doe is sick</p>
), а в смешанном содержимое или распределяться по нескольким элементам, например<p><prename>John</prename> <surname>Doe</surname> is sick.</p>
). Таким образом, по крайней мере, покажите нам репрезентативную небольшую выборку входных и выходных данных, даже если вы чувствуете, что ваша попытка кодирования не удалась. Но вы могли бы также показать один и рассказать нам, как именно он не удался. - person Martin Honnen   schedule 23.03.2020