【问题标题】:XQuery XML insertXQuery XML 插入
【发布时间】:2015-08-31 00:18:03
【问题描述】:

我有基于 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。

【问题讨论】:

  • OSB 是否提供 XSLT 2.0 处理器?
  • 没有。 OSB 仅支持 XSLT 1.0。

标签: xml xslt xquery transformation osb


【解决方案1】:

您需要进行递归复制(请参阅身份模板模式),如果当前节点是匹配项(是一个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>

【讨论】:

  • 我在这一行中发现了一个错误: "field" 后遗漏了斜线符号,但无论如何 - 谢谢.它有效。
  • 真的吗?如果这是真的,那么恭喜,您刚刚在编译器中发现了一个错误 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多