У меня есть требование, где мне нужно заменить значение узла на основе атрибутов другим значением, сохранив исходную структуру XML. По сути, мне нужно скопировать весь XML только путем замены определенных значений, когда указанные атрибуты c встречаются в оригинале XML.
Ниже приведен пример XML до преобразования и после преобразования.
Оригинал XML:
<root>
<body>
<node_level1>
<node_level2>
<node_level3>
<value animal="cat">Munchkin</value>
</node_level3>
<node_level3>
<value animal="cat">Turkish Angora</value>
</node_level3>
<node_level3>
<value animal="cat">La Perm</value>
</node_level3>
</node_level2>
<node_level2>
<node_level3>
<node_level4>
<value animal="dog">Siberian Husky</value>
</node_level4>
<node_level4>
<value animal="dog">Pug</value>
</node_level4>
<node_level4>
<value animal="dog">Beagle</value>
</node_level4>
</node_level3>
</node_level2>
</node_level1>
</body>
</root>
После преобразования данных с использованием XSLT мне нужно XML, как показано ниже:
<root>
<body>
<node_level1>
<node_level2>
<node_level3>
<value animal="cat">Cat Family</value>
</node_level3>
<node_level3>
<value animal="cat">Cat Family</value>
</node_level3>
<node_level3>
<value animal="cat">Cat Family</value>
</node_level3>
</node_level2>
<node_level2>
<node_level3>
<node_level4>
<value animal="dog">Dog Family</value>
</node_level4>
<node_level4>
<value animal="dog">Dog Family</value>
</node_level4>
<node_level4>
<value animal="dog">Dog Family</value>
</node_level4>
</node_level3>
</node_level2>
</node_level1>
</body>
</root>
Вот код, который работает для указанных атрибутов, мне нужно обобщить его.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xsl" version="2.0">
<xsl:template match="/">
<root>
<xsl:for-each select="//*[value[@animal = 'cat']]">
<xsl:copy>
<xsl:value-of select="@*"/>
<xsl:value-of select="'Cat Family'"/>
</xsl:copy>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>