У меня есть пример XML-файла, который выглядит следующим образом:
--- before transformation ---
<root-node>
<child-type-A> ... </child-type-A>
<child-type-A> ... </child-type-A>
<child-type-B> ... </child-type-B>
<child-type-C>
<child-type-B> ... </child-type-B>
...
</child-type-C>
...
</root-node>
Я хочу преобразовать этот XML-файл в нечто, похожее на это:
--- after transformation ---
<root-node>
<child-node> ... </child-node>
<child-node> ... </child-node>
<child-node> ... </child-node>
<child-node>
<child-node> ... </child-node>
...
</child-node>
...
</root-node>
Фактически это означает, что структура документа остается прежней, но некоторые «выбранные» элементы переименовываются.Эти выбранные элементы начинаются с того же префикса (в этом примере с «child-type-»), но имеют различные суффиксы («A» | «B» | «C» | и т. Д.).
Почему все этонервотрепки?У меня есть программное обеспечение, которое требует ввода XML-файла.Для удобства я использую XML-схему, чтобы легко редактировать XML-файл, и эта схема помогает убедиться, что XML-файл будет правильным.К сожалению, XML-схемам не хватает некоторых аспектов чувствительности к контексту.Это приводит к тому, что XML-файл выглядит так, как показано в / перед преобразованием /.Программное обеспечение не может обработать такой xml-файл, поскольку ожидает файл, показанный в / после преобразования /.Таким образом, потребность в преобразовании.
Я хочу выполнить преобразование с помощью XSLT, и я уже понял, как это сделать.Мой подход состоял в том, чтобы определить правило для преобразования идентификаторов и одно правило для каждого элемента "child-type- *", который необходимо переименовать.Это решение работает, но оно не так уж и элегантно.В конечном итоге вы получаете множество правил.
--- sample transformation rules ---
<!-- Identity transformation -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="child-type-A">
<xsl:element name="child-node">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
...
Есть ли способ сжать это только в два правила?Один для преобразования идентичности и один для всех элементов child-type- *?Может быть, используя XSLT в сочетании с некоторым регулярным выражением?Или вам нужно использовать другой подход для решения такой проблемы?