我一直在尝试编写 XSLT 来合并两个不同的 XML,并使用 XSLT v2.0 的 XSLT 代码生成不同的 XML 输出。
以下是我的要求。
输入 XML1 是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<externalIdFields xmlns="urn:partner.soap.sforce.com/">
<object name="Account">
<ExternalID>
<name>ExtAccountID__c</name>
<type>string</type>
</ExternalID>
</object>
<object name="User"/>
<object name="Contact">
<ExternalID>
<name>ExtContactID__c</name>
<type>string</type>
</ExternalID>
</object>
<object name="Opportunity">
<ExternalID>
<name>ExtOpportunityID__c</name>
<type>decimal</type>
</ExternalID>
<ExternalID>
<name>UniqueAnotherOppID__c</name>
<type>boolean</type>
</ExternalID>
</object>
XML2 是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<relationshipNames>
<object name="Account">
<reletionshipName>Parent</reletionshipName>
</object>
<object name="User">
<reletionshipName>Owner</reletionshipName>
</object>
<object name="Contact">
<reletionshipName>LookUpContact__r</reletionshipName>
</object>
<object name="Opportunity">
<reletionshipName>LookUpOpportunity__r</reletionshipName>
</object>
<object name="Opportunity">
<reletionshipName>AnotherRelationship__r</reletionshipName>
</object>
</relationshipNames>
第一个 XML 包含每个对象的所有外部 ID,第二个 XML 包含每个对象的所有关系名称。
输出 XML 应该是
<?xml version="1.0" encoding="UTF-8"?>
<result xmlns:con = "http://www.approuter.com/schemas/cdk/config/">
<con:field name = "Parent.ExtAccountID__c" label = "Parent.ExtAccountID__c">
<con:type>string</con:type>
</con:field>
<con:field name = "LookUpContact__r.ExtContactID__c" label="LookUpContact__r.ExtContactID__c">
<con:type>string</con:type>
</con:field>
<con:field name = "LookUpOpportunity__r.ExtOpportunityID__c" label = "LookUpOpportunity__r.ExtOpportunityID__c">
<con:type>decimal</con:type>
</con:field>
<con:field name = "LookUpOpportunity__r.UniqueAnotherOppID__c." label = "LookUpOpportunity__r.UniqueAnotherOppID__c">
<con:type>boolean</con:type>
</con:field>
<con:field name = "AnotherRelationship__r.ExtOpportunityID__c." label = "AnotherRelationship__r.ExtOpportunityID__c">
<con:type>boolean</con:type>
</con:field>
<con:field name = "AnotherRelationship__r.UniqueAnotherOppID__c." label = "AnotherRelationship__r.UniqueAnotherOppID__c">
<con:type>boolean</con:type>
</con:field>
</result>
合并很简单。对于每个对象的每个 externalId,创建一个 con:field 标记,这里 name 和 label 的值应该是该对象的对应 relationshipName 和 externalId 字段名称。它将是relationshiName.externalIdFieldName。对象的 relationshipName 应仅与该对象的 externalIds 相关联。
我们怎样才能做到这一点?我看到了一个 XSLT 来合并两个 XML。但我不理解不同示例的“@* | node()”部分。在这里,我没有找到解析两个完全不同的 XML 的示例。
感谢你的帮助。