【问题标题】:BizTalk mapping based on datatype基于数据类型的 BizTalk 映射
【发布时间】:2015-03-28 01:37:44
【问题描述】:

我正在处理一个大型架构映射。映射的任务之一是规范化特殊数据类型值。对于具有此数据值的每个元素,需要将 Src 值发送到外部程序集以进行“标准化”。

在 src 和 dst 模式中都有数百个此类元素。它使映射文件变得非常大并且难以维护。

我想知道是否可以使用某种 xslt functorids 甚至自定义的 xslt 来简单地将所有元素与此数据类型匹配并进行映射。

对于所有其他元素映射,简单的值复制就足够了,但是 src 和 dst 有不同的目标架构。

有什么建议吗?

更新: 我创建了一个简单的模式来解释我的情况:下面的模式。 您可以假设存在另一个具有相同结构但目标名称空间不同的架构。映射需要找到数据类型为“NM”的所有元素,并将其值提供给外部程序集。 (假设它是一个简单的 C# string.Reverse()) 然后将值输出到 dst 架构元素中的同一节点。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://BizTalk_Server_Project1.Schema1" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://BizTalk_Server_Project1.Schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Record1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="R2">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="R3">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="UsedName">
                            <xs:simpleType>
                              <xs:restriction base="NM" />
                            </xs:simpleType>
                          </xs:element>
                          <xs:element name="Age">
                            <xs:simpleType>
                              <xs:restriction base="xs:int" />
                            </xs:simpleType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="AnotherName">
                      <xs:simpleType>
                        <xs:restriction base="NM">
                          <xs:maxLength value="10" />
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="Gender">
                    <xs:simpleType>
                      <xs:restriction base="xs:string" />
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Name">
                <xs:simpleType>
                  <xs:restriction base="NM">
                    <xs:maxLength value="10" />
                    <xs:minLength value="1" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="NM">
    <xs:restriction base="xs:string" />
  </xs:simpleType>
</xs:schema>

【问题讨论】:

  • 能否请您使用特殊数据类型发布一个小的 xml sn-p。
  • 你真的得到了像 Record1、Record2、Resord3...Record8762 这样的元素。如果是,请返回源并让他们更改此设置。这不是正常的 Xml。 应该只是重复。
  • 谢谢。约翰。实际上,该模式是一个复杂的 EDI X12 模式。这是无法改变的。上面的架构只是一个简单的示例。

标签: xslt biztalk


【解决方案1】:

如果那是真正的 EDI X12,那么进来的文件应该给出 ST01 中的文件类型。如果您可以配置您的流程来检查该字段,您可能会区分文件类型。

【讨论】:

    【解决方案2】:

    我认为 XSLT 1.0 无法做到这一点(但显然 2.0 可以做到?我不太确定,但这没关系,因为 BizTalk 和 .NET 不支持 2.0)。

    一种方法是从模式(指定数据类型的地方)生成节点列表(可能带有它们的 XPath)。您可以以编程方式执行此操作(也许在 XSD 文件上使用 XSLT?使用 .NET 类对其进行解析?)或对其进行硬编码。生成列表后,我可能会选择对其进行硬编码。理想情况下,该列表将包含一组唯一节点名称或 XPath(可能带有命名空间的占位符)。那时我会选择某种 .NET 实现(使用 XDocument 或 XPathNavigator),做这样的事情......

    XDocument xdoc = XDocument.Parse(xmlInput);
    foreach (string xPath in ListOfXPaths)
    {
        NormalizeData(xdoc.XPathSelectElement(string.Format(xPath, "proper namespace for trading partner here")));
    }
    ...
    NormalizeData(XElement el)
    {
        el.Value = something else;
    }
    

    您可以在地图之前或之后执行此操作 - 如果消息来自贸易伙伴,请在之后执行,否则在之前执行(这样您可以更好地控制命名空间)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多