Добрый день .... Я пытаюсь дублировать узлы с обновленным / новым текстом элемента и / или значениями атрибутов.
Мой входной XML-файл:
<?xml version="1.0"?>
<products author="Jesper">
<product id="p1">
<name>Delta</name>
<price>800</price>
<stock>4</stock>
<country>Denmark</country>
</product>
</products>
Желаемый вывод XML:
<?xml version="1.0" encoding="utf-8"?>
<products author="Jesper">
<product id="p1">
<name>Delta</name>
<price>800</price>
<stock>4</stock>
<country>Denmark</country>
</product>
<product id="NEW_p1">
<name>NEW_Delta</name>
<price>NEW_800</price>
<stock>NEW_4</stock>
<country>NEW_Denmark</country>
</product>
</products>
Через некоторое время XSLT, который у меня сейчас есть, выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match ="product">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<product>
<xsl:attribute name ="id">
<xsl:value-of select ="concat('NEW_',@id"/>
</xsl:attribute>
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</product>
</xsl:template>
However, using the above transform, I get the following XML output:
<?xml version="1.0" encoding="utf-8"?>
<products author="Jesper">
<product id="p1">
<name>Delta</name>
<price>800</price>
<stock>4</stock>
<country>Denmark</country>
</product>
<product id="NEW_p1"><product>
<name>Delta</name>
<price>800</price>
<stock>4</stock>
<country>Denmark</country>
</product></product>
</products>
Как видите, элемент product добавлен, в то время как я объявил новый элемент product с новым значением @id. Поскольку я использую для обработки дочерних узлов, я считаю, что это снова обрабатывает элемент product.
Кроме того, мне нужна помощь в обновлении значений дочернего узла (добавление «NEW_» к каждому значению). Изучая обширные вопросы на этом сайте, я считаю, что мне нужен такой шаблон:
<xsl:template match="*">
<xsl:element name ="{local-name()}">
<!--for all attributes-->
<xsl:copy-of select ="@*"/>
<xsl:value-of select = "."/>
</xsl:element>
</xsl:template>
Заранее благодарим вас за любые предложения / идеи по моей проблеме.
ОБНОВЛЕНО Спасибо @Mathias за ответ на мой первоначальный вопрос. Полученный ответ вызвал еще один вопрос, связанный с рекурсией на более глубокие уровни структуры XML.
Входной XML-файл:
<products author="Jesper">
<product id="p1">
<name>Delta
<innerName>MiddleDelta
<baseName>FinalDelta</baseName>
</innerName>
</name>
<price>800</price>
<stock>4</stock>
<country>Denmark
<city>Copenhagen</city>
</country>
</product>
</products>
И обновленный выходной файл желания выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<products author="Jesper">
<product id="p1">
<name>Delta
<innerName>MiddleDelta
<baseName>FinalDelta</baseName>
</innerName>
</name>
<price>800</price>
<stock>4</stock>
<country>Denmark
<city>Copenhagen</city>
</country>
</product>
<product id="NEW_p1">
<name>NEW_Delta
<innerName>NEW_MiddleDelta
<baseName>NEW_FinalDelta</baseName>
</innerName>
</name>
<price>NEW_800</price>
<stock>NEW_4</stock>
<country>NEW_Denmark
<city>NEW_Copenhagen</city>
</country>
</product>
</products>
Я могу только догадываться, что использование шаблонов будет работать так, как если бы каждый узел имел дочерние узлы разного уровня. Заранее благодарим вас за идеи / предложения по этому поводу.