0

我们有一个需求,我们需要为一个节点获取一个字符串形式的 XML 有效负载,我们需要扩展这个 XML 并将 XML 节点值传递给目标 XSD 列。

例如输入 XSD:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transaction xmlns="http://xmlns.oracle.com/2012/SCEM">
    <TRXKEY>0x0000013</TRXKEY>
    <EVENTNAME>SalesOrder</EVENTNAME>
    <ACCEPTEDQUANTITY>0</ACCEPTEDQUANTITY>
    <ORDEREDQUANTITY>0</ORDEREDQUANTITY>
    <SOLORGID>0</SOLORGID>
    <LHORDERHOLDIDRELEASED>0</LHORDERHOLDIDRELEASED>
    <ORDEREDQUANTITYUOM>0</ORDEREDQUANTITYUOM>
    <UNITSELLINGPRICE>0</UNITSELLINGPRICE>
    <ORDERTYPE>&lt;Val lang='AR'&gt;OrderTypeARARARAR&lt;/Val&gt;
                    &lt;Val lang='KO'&gt;OrderTypeKOKOKOKO&lt;/Val&gt;
                    &lt;Val lang='US'&gt;OrderTypeUSUSUUS&lt;/Val&gt;
                   </ORDERTYPE>
</Transaction>

输出 XML

<Transaction1 xmlns="http://xmlns.oracle.com/2012/SCEM">
    <TRXKEY>0x0000013</TRXKEY>
    <EVENTNAME>SalesOrder</EVENTNAME>
    <ACCEPTEDQUANTITY>0</ACCEPTEDQUANTITY>
    <ORDEREDQUANTITY>0</ORDEREDQUANTITY>
    <SOLORGID>0</SOLORGID>
    <LHORDERHOLDIDRELEASED>0</LHORDERHOLDIDRELEASED>
    <ORDEREDQUANTITYUOM>0</ORDEREDQUANTITYUOM>
    <UNITSELLINGPRICE>0</UNITSELLINGPRICE>
    <ORDERTYPE_AR>OrderTypeARARARAR</ORDERTYPE_AR>
    <ORDERTYPE_US>OrderTypeUSUSUUS</ORDERTYPE_US>
    <ORDERTYPE_KO>OrderTypeKOKOKOKO</ORDERTYPE_KO>
</Transaction>

我们需要遍历 ORDERTYPE 节点 XML 字符串。根据 'Val lang=' 值,我们需要将此节点值传递给输出 XSD ORDERTYPE_$lang 值列。

我如何遍历这两个不同值的 XML 字符串并将其传递给相应的输出 XML 列?

我正在考虑使用拆分,但它没有多大帮助。

4

1 回答 1

1

谢谢马丁,

I have come up with below code which resolved my issue.

    <xsl:stylesheet version="1.0"
            xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
            xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
            xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction"
            xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
            xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue"
            xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:med="http://schemas.oracle.com/mediator/xpath"
            xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath"
            xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions"
            xmlns:client="http://xmlns.oracle.com/KeyStore/emsProjXslt/BPELProcess1"
            xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk"
            xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions"
            xmlns:ns2="http://xmlns.oracle.com/2012/SCEM"
            xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns:ora="http://schemas.oracle.com/xpath/extension"
            xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator"
            xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap"
            exclude-result-prefixes="xsi xsl client ns2 plnk xsd wsdl bpws xp20 mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap">
      <xsl:template match="/">
        <ns2:Transaction>

          <ns2:TRXKEY>
            <xsl:value-of select="/ns2:Transaction/ns2:TRXKEY"/>
          </ns2:TRXKEY>
            <xsl:call-template name="for.loop.Parameters">
            <xsl:with-param name="sourceNodes"
                            select='substring-after(/ns2:Transaction/ns2:ORDERTYPE,"Val lang=")'/>
          </xsl:call-template>

        </ns2:Transaction>
      </xsl:template>
      <xsl:template name="for.loop.Parameters">
        <xsl:param name="sourceNodes"/>
        <xsl:variable name="temp">
          <xsl:choose>
            <xsl:when test="string-length($sourceNodes) > '0'">
              <xsl:value-of select="substring-before($sourceNodes,'&lt;/Val>')"/>
            </xsl:when>
          </xsl:choose>
        </xsl:variable>
        <xsl:variable name="Expression" select="substring-after($temp, '>')"/>
        <xsl:variable name="Expression1" select="substring-before($temp, '>')"/>

        <xsl:if test="contains($Expression1,'AR')">
          <ns2:ORDERTYPE_AR>
            <xsl:value-of select="$Expression"/>
          </ns2:ORDERTYPE_AR>
        </xsl:if>
        <xsl:if test="contains($Expression,'US')">
          <ns2:ORDERTYPE_US>
            <xsl:value-of select="$Expression"/>
          </ns2:ORDERTYPE_US>
        </xsl:if>
        <xsl:if test="contains($Expression,'KO')">
          <ns2:ORDERTYPE_KO>
            <xsl:value-of select="$Expression"/>
          </ns2:ORDERTYPE_KO>
        </xsl:if>
        <xsl:variable name="test">
          <xsl:value-of select="substring-after($sourceNodes,'/Val>')"/>
        </xsl:variable>
        <xsl:if test="string-length($test) > 1 ">
          <xsl:call-template name="for.loop.Parameters">
            <xsl:with-param name="sourceNodes">
              <xsl:value-of select='substring-after($test,"Val lang=")'/>
            </xsl:with-param>
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
    </xsl:stylesheet>
于 2013-08-27T12:08:10.270 回答