Как выбрать узел в одном исходном XML, если значение элемента совпадает с элементом в исходном XML, используя XSLT 1.0 - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в XSLT и застрял с проблемой.

У меня есть два xml-файла, как указано ниже, и мне нужно выбрать только активные аккаунты из source1.xml, когда "account_no" и "dunningStep"учетной записи в source1.xml совпадает со значениями «account_no» и «dunningStep» в source2.xml.

Также, если для учетной записи в source2.xml существует несколько шагов напоминания, тогда необходимо соответствовать наибольшему »dunningStep "в source2.xml с" dunningStep "в source1.xml.

Источник 1:

<accounts>
    <account1>
        <name>abc</name>
        <account_no>123</account_no>
        <status>Active</status>
        <dunningStep>1</dunningStep>
    </account1>
    <account2>
        <name>def</name>
        <account_no>123</account_no>
        <status>Active</status>
        <dunningStep>3</dunningStep>
    </account2>
    <account3>
        <name>ghi</name>
        <account_no>1234</account_no>
        <status>Active</status>
        <dunningStep>2</dunningStep>
    </account3>
    <account4>
        <name>jkl</name>
        <account_no>1234</account_no>
        <status>Active</status>
        <dunningStep>1</dunningStep>
    </account4>
    <account5>
        <name>lkj</name>
        <account_no>1234</account_no>
        <status>In Active</status>
        <dunningStep>1</dunningStep>
    </account5>
</accounts>

Источник 2:

<plans>
    <plan1>
        <name>abc</name>
        <account_no>123</account_no>
        <dunningStep>1</dunningStep>
    </plan1>
    <plan2>
        <name>def</name>
        <account_no>123</account_no>
        <dunningStep>3</dunningStep>
    </plan2>
    <plan3>
        <name>jkl</name>
        <account_no>1234</account_no>
        <dunningStep>1</dunningStep>
    </plan3>
</plans>

Ожидаемый результат:

<accounts>
        <account2>
            <name>def</name>
            <account_no>123</account_no>
            <status>Active</status>
            <dunningStep>3</dunningStep>
        </account2>
        <account4>
            <name>jkl</name>
            <account_no>1234</account_no>
            <status>Active</status>
            <dunningStep>1</dunningStep>
        </account4>
    </accounts>

Я пробовал ниже XSLT, но он не работает для меня.

<oracle-xsl-mapper:schema>
    <!--SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY.-->
    <oracle-xsl-mapper:mapSources>
      <oracle-xsl-mapper:source type="WSDL">
        <oracle-xsl-mapper:schema location="../WSDLs/GetAriaAccountDetails.wsdl"/>
        <oracle-xsl-mapper:rootElement name="get_acct_details_all_mResponseElement"
                                       namespace="urn:client:api:wsdl:document/literal_wrapped:vers:6.50:aria_complete_m_api"/>
      </oracle-xsl-mapper:source>
      <oracle-xsl-mapper:source type="WSDL">
        <oracle-xsl-mapper:schema location="../WSDLs/Billing_Subscription_Dunning_Process.wsdl"/>
        <oracle-xsl-mapper:rootElement name="DunningDetails" namespace="urn:subaru:canonical:DunningSchema:1"/>
        <oracle-xsl-mapper:param name="ReceiveDunningRequest_process_dunning_InputVariable.part1"/>
      </oracle-xsl-mapper:source>
    </oracle-xsl-mapper:mapSources>
    <oracle-xsl-mapper:mapTargets>
      <oracle-xsl-mapper:target type="WSDL">
        <oracle-xsl-mapper:schema location="../WSDLs/GetAriaAccountDetails.wsdl"/>
        <oracle-xsl-mapper:rootElement name="get_acct_details_all_mResponseElement"
                                       namespace="urn:client:api:wsdl:document/literal_wrapped:vers:6.50:aria_complete_m_api"/>
      </oracle-xsl-mapper:target>
    </oracle-xsl-mapper:mapTargets>
    <!--GENERATED BY ORACLE XSL MAPPER 12.2.1.2.0(XSLT Build 161003.0739.0018) AT [FRI OCT 11 11:21:53 IST 2019].-->
  </oracle-xsl-mapper:schema>
  <!--User Editing allowed BELOW this line - DO NOT DELETE THIS LINE-->

<xsl:param name="ReceiveRequest2.part1"/>
  <xsl:key name="acc"
           match="*[starts-with(name(), 'account') and (ns0:status='Active')]"
           use="ns0:master_plan_no"/>
  <xsl:template match="/">
    <ns0:accounts>
     <xsl:apply-templates select='ns0:accounts'/>
    </ns0:accounts>
  </xsl:template>
  <xsl:template match="ns0:accounts">
    <xsl:for-each select="*[starts-with(name(), 'account') and (ns0:status='Active')][count(. | key('acc', ns0:account_no)[1]) = 1]">
      <xsl:for-each select="key('acc', ns0:account_no)">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </xsl:for-each>
    <xsl:for-each select='ns0:accounts/ns0:account'>
    <xsl:for-each select="$ReceiveRequest2.part1/ns1:plans/ns1:plan[ns1:account_no=ns0:account_no]">
    <xsl:sort select="ns1:dunningStep" order="descending" type="number">
    <xsl:if test="position()=1">
        <xsl:if test='ns0:dunningStep=.'>
        <xsl:copy-of select="ns0:accounts/*"/>
        </xsl:if>
    </xsl:if>
    </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

Пожалуйста, помогите мне с этим и спасибо заранее.

...