Заменить часть текста

#xml

Вопрос:

У меня есть много файлов, содержащих кодировку, подобную этой:

 <link linkaction="immediate" linktype="return" xlink:href="IETM://S50005#S50005-TOOL1" 
  xreftype="table">
  <prompt>Multimeter</prompt>
</link>
 

Это должно быть заменено этим:

 <xref itemid="S50005-TOOL1" wpid="S50005"/>
 

Необходимо изменить структуру тегов, но сохранить справочную информацию.
Возможно ли это с помощью Notepad ?

Комментарии:

1. Нажмите на кнопку ? в правом верхнем углу окна редактирования, чтобы получить справку по форматированию. Когда вы отредактируете свой вопрос, чтобы включить правильно отформатированный XML, я смогу помочь.

2. На мой взгляд, он, по-видимому, обновлен с правильным синтаксисом

3. Чтобы было более понятно, я хочу заменить все «ссылки» на «внешние ссылки», но хочу получить идентификационную информацию из ссылки и включить ее в замены внешних ссылок.

4. ИМХО, преобразование XSLT лучше всего подходит для этой задачи.

5. Спасибо вам за такой быстрый ответ! Похоже, это действительно дает желаемый результат. Я не уверен, как бы я использовал это для сотен файлов? Можно ли было бы сделать это с помощью Notepad , заменить?

Ответ №1:

Вот решение на основе XSLT. Для этого в Notepad есть плагин XML Tools.

Чтобы сделать входной XML правильно сформированным, мне пришлось добавить пространство имен в корневой тег.

Входной XML

 <?xml version="1.0"?>
<root xmlns:xlink="URI">
    <link linkaction="immediate" linktype="return"
          xlink:href="IETM://S50005#S50005-TOOL1" xreftype="table">
        <prompt>Multimeter</prompt>
    </link>
    <link linkaction="immediate" linktype="return"
          xlink:href="IETM://S50005#S50018-TOOL15" xreftype="table">
        <prompt>Multimeter</prompt>
    </link>
</root>
 

XSLT

 <?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="URI">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="link">
        <xref itemid="{substring-after(@xlink:href, '#')}" wpid="{substring-before(substring-after(@xlink:href, '#'),'-')}"/>
    </xsl:template>
</xsl:stylesheet>
 

Выход

 <root xmlns:xlink="URI">
  <xref itemid="S50005-TOOL1" wpid="S50005" />
  <xref itemid="S50018-TOOL15" wpid="S50018" />
</root>