Преобразование одного атрибута XML элемента в дочерний элемент - PullRequest
0 голосов
/ 26 мая 2020

Прежде всего, я хочу express восхищаться всеми, кто понимает, что происходит при обработке XSLT.

Обычно я нахожу в StackOverflow какой-нибудь пример, который делает то, что мне нужно, немного настраиваю его и продолжаю работать с C кодированием :), но на этот раз я застрял и не понимаю почему что-то не работает.

Я нашел достаточно близкий вопрос здесь

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

Т.е. я могу получить:

<sect id="5" heading="1">
</sect>

, которое нужно изменить на:

<sect heading="1">
    <id>5</id>
</sect>

Используя пример здесь

Но my XML немного сложнее, и на данный момент обнаружено 2 проблемы для его обработки (обе представлены в ссылке выше):

  1. Я хочу, чтобы новый элемент был размещен первым после исходного элемента , но если свободный текст появится после исходного элемента, результат будет другим, т.е. новый элемент будет после текста.
  2. Что-то пошло не так при обработке изменяемого мной элемента, например, следующее:

<TableCell>User input and actions: for example, type <bold>exit</bold>, click <bold>OK</bold>, press <bold>Alt+C</bold></TableCell>

будет изменено на

<TableCell>User input and actions: for example, type , click , press <bold>exit</bold><bold>OK</bold><bold>Alt+C</bold></TableCell>

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

Поскольку я не понимаю порядок обработки в XSLT, я не знаю, как это исправить. Мы будем очень признательны за любую помощь с этим или полностью альтернативным предложением.

С уважением, Илья.

1 Ответ

1 голос
/ 26 мая 2020

Может быть достаточно сначала обработать атрибуты, которые вы хотите скопировать как атрибуты, с одним шаблоном применения (или просто использовать для них copy-of), а затем применить шаблоны к атрибуту id и любым дочерним узлам:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*[not(name()='id')]"/>
      <xsl:apply-templates select="@id | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@id">
      <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bEzkntb/7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...