XQuery XML 插入
XQuery XML insert
我有 XML 个基于目标数据:
<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>
有配置字段列表:
<myFieldData>
<field>KEY_1</field>
<field>INNER_KEY_2</field>
<field>INNER_INNER_KEY_1</field>
<field>KEY_3</field>
<myFieldData>
配置字段值表示目标 XML 应附加以下两对:
<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>
转换后的结果应该是:
<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>
是否可以使用 XQuery 来做到这一点?或者更好地使用 XSLT?如果可能的话——怎么做?也许递归函数?转换将在 Oracle Service Bus 中使用。
您需要进行递归复制(参见标识模板模式),如果当前节点匹配(是 pairs
元素,具有匹配的 key
),那么您之后还必须生成 2 个元素。此样式表正是这样做的:
<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 a 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>
我有 XML 个基于目标数据:
<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>
有配置字段列表:
<myFieldData>
<field>KEY_1</field>
<field>INNER_KEY_2</field>
<field>INNER_INNER_KEY_1</field>
<field>KEY_3</field>
<myFieldData>
配置字段值表示目标 XML 应附加以下两对:
<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>
转换后的结果应该是:
<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>
是否可以使用 XQuery 来做到这一点?或者更好地使用 XSLT?如果可能的话——怎么做?也许递归函数?转换将在 Oracle Service Bus 中使用。
您需要进行递归复制(参见标识模板模式),如果当前节点匹配(是 pairs
元素,具有匹配的 key
),那么您之后还必须生成 2 个元素。此样式表正是这样做的:
<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 a 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>