Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="text()">
<value>
<xsl:value-of select="."/>
</value>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<book author="Name" year="2000">Book title</book>
дает желаемый, правильный результат:
<book><author>Name</author><year>2000</year><value>Book title</value></book>
Объяснение
Правило / шаблон копирует каждый узел "как есть".
Мы заменяем правило идентификации шаблоном, соответствующим любому атрибуту. Он создает элемент, имя которого является именем соответствующего атрибута, а единственный дочерний элемент текстового узла является значением соответствующего атрибута.
Наконец, мы переопределяем правило идентификации шаблоном, который соответствует любому текстовому узлу. Он просто выводит этот узел, завернутый в value
родительский элемент.
Примечание. 1040 *: Использование и переопределение правила идентификации является наиболее фундаментальным и мощным шаблоном проектирования XSLT.
Я бы хотел сделать это с помощью xslt или
что-то, что я могу запустить из Баш ...
Большинство процессоров XSLT поставляются с утилитой командной строки , которая вызывает преобразование XSLT из командной строки. Прочитайте документацию вашего процессора XSLT.