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

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

php - Find a regex to take part of Email -