これは私のxml入力ファイルです
<ELEMENTROOT>
<id>10036</id>
<firstName>Marco</firstName>
<lastName>Nato</lastName>
<addressSet>
<address>
<country>
<displayValue>France</displayValue>
</country>
</address>
</addressSet>
<clobMap/>
<dateMap>
<entry>
<key>birthDate</key>
<value>1973-11-29T00:00:00</value>
</entry>
</dateMap>
<myMap>
<entry>
<key>gender</key>
<value>
<id>1042</id>
<displayValue>Femminile</displayValue>
</value>
</entry>
<myMap>
</ELEMENTROOT>
取得したい結果
<ELEMENTROOT>
<id>10036</id>
<firstName>Marco</firstName>
<lastName>Nato</lastName>
<addressSet>
<address>
<country>
<displayValue>France</displayValue>
</country>
</address>
</addressSet>
<clobMap/> <!-- Unlikely I don't have this with my xsl-->
<birthDate>
1973-11-29T00:00:00
</birthDate>
<gender>
<id>1042</id>
<displayValue>Femminile</displayValue>
</gender>
</ELEMENTROOT>
私が試したxslファイルはこれです:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="myMap">
<xsl:for-each select="entry">
<xsl:element name="{key}">
<xsl:copy-of select="value/*" />
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template match="*[contains(name(), 'Map')][not(contains(name(), 'myMap'))]">
<xsl:for-each select="./entry">
<xsl:element name="{key}">
<xsl:value-of select="value" />
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
ご存知のように、私にはこの問題があります。マップに子がある場合はテンプレートのみを適用する必要があります。そうしないと、上記の例のようにノードが失われます。子を持つマップのみに一致するように別のアプローチを試みましたが、2 種類のマップがあります。各エントリに 2 つの値を持つ「myMap」と、各エントリに 1 つの値を持つ「dateMap」です。
ご助力ありがとうございます!