xslt - XQuery XML insert -
i have xml based target data:
<mytargetdata> <mymap> <pairs> <key>key_1</key> <value> <mymap> <pairs> <key>inner_key_1</key> <value/> </pairs> <pairs> <key>inner_key_2</key> <value/> </pairs> <pairs> <key>inner_key_3</key> <value> <mymap> <pairs> <key>inner_inner_key_1</key> <value/> </pairs> <pairs> <key>inner_inner_key_2</key> <value/> </pairs> </mymap> </value> </pairs> </mymap> </value> </pairs> <pairs> <key>key_2</key> <value> <mystring>test string 2</mystring> </value> </pairs> <pairs> <key>key_3</key> <value> <mystring>test string 3</mystring> </value> </pairs> <pairs> <key>key_4</key> <value> <mystring>test string 4</mystring> </value> </pairs> </mymap> </mytargetdata> there configuration field list:
<myfielddata> <field>key_1</field> <field>inner_key_2</field> <field>inner_inner_key_1</field> <field>key_3</field> <myfielddata> configuration field value means target xml should appended following 2 pairs:
<pairs> <key>{key name}_appendix1</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>{key name}_appendix2</key> <value><mystring>smth text</mystring></value> </pairs> the result after transformation should be:
<mytargetdata> <mymap> <pairs> <key>key_1</key> <value> <mymap> <pairs> <key>inner_key_1</key> <value/> </pairs> <pairs> <key>inner_key_2</key> <value/> </pairs> <pairs> <key>inner_key_2_appendix1</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>inner_key_2_appendix2</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>inner_key_3</key> <value> <mymap> <pairs> <key>inner_inner_key_1</key> <value/> </pairs> <pairs> <key>inner_inner_key_1_appendix1</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>inner_inner_key_1_appendix2</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>inner_inner_key_2</key> <value/> </pairs> </mymap> </value> </pairs> </mymap> </value> </pairs> <pairs> <key>key_1_appendix1</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>key_1_appendix2</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>key_2</key> <value> <mystring>test string 2</mystring> </value> </pairs> <pairs> <key>key_3</key> <value> <mystring>test string 3</mystring> </value> </pairs> <pairs> <key>key_3_appendix1</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>key_3_appendix2</key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key>key_4</key> <value> <mystring>test string 4</mystring> </value> </pairs> </mymap> </mytargetdata> is possible using xquery? or better use xslt? if possible - how that? maybe recursive function? transformation used in oracle service bus.
you need make recursive copy (see identity template pattern), , if current node match (is pairs element, matching key), have generate 2 elements after. stylesheet that:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:variable name="keys" select="document('so-001-keys.xml')/myfielddata"/> <xsl:template match="node()"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="node()"/> </xsl:copy> <!-- if it's match, add new elements --> <xsl:if test="self::pairs[key = $keys/field]"> <pairs> <key> <xsl:value-of select="key"/> <xsl:text>_appendix1</xsl:text> </key> <value><mystring>smth text</mystring></value> </pairs> <pairs> <key> <xsl:value-of select="key"/> <xsl:text>_appendix2</xsl:text> </key> <value><mystring>smth text</mystring></value> </pairs> </xsl:if> </xsl:template> </xsl:stylesheet>
Comments
Post a Comment