Я много осматривал здесь, но не могу найти решение моей проблемы и нуб, когда использую RegEx.

Я пытаюсь изменить файл XML с тегами, которые выглядят так:

<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>
<key>Date Added</key><date>2014-09-09T18:06:23Z</date>

Чтобы теги выглядели так:

<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>
<key>Date Added</key><date>2014-09-??T18:06:23Z</date>

В основном изменив поле Дата добавления на 2014-09-?? для чего-либо совпадающего

<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>

Но время «T16:18:44z» всегда разное. Только дата одинакова.(Т.е.)

<key>Date Modified</key><date>2014-09-09..........</date>

1 ответ1

0

Регулярные выражения - неподходящий инструмент для работы. Смотрите эту знаменитую диатрибу на эту тему: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

Правильный инструмент для работы - это язык преобразования XML XSLT. XSLT 2.0 может использовать регулярные выражения для манипулирования содержимым отдельных узлов, но он использует правильный анализатор XML для понимания разметки. Вот правило преобразования, которое вы можете включить в свой XSLT для этой задачи:

<xsl:template match="date
                        [preceding-sibling::key[1]='Date Added']
                        [preceding-sibling::key[2]='Date Modified']
                        [starts-with(preceding-sibling::date[1],'2014-09-09')]">
  <date>
    <xsl:value-of select="concat(substring(.,1, 8), '??', substring(, 11))"/>
  </date>
</xsl:template> 

(Причина, по которой шаблон соответствия настолько сложен, заключается в том, что XML так плохо структурирован. Нет элемента-обертки, связывающего ключ и дату, и нет элемента, связывающего два ключевых элемента).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .