基于数据类型的BizTalk映射

时间:2015-01-28 23:25:19

标签: xslt biztalk

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

在src和dst模式中有数百种这样的元素。它使映射文件非常大并且难以维护。

我想知道我是否可以使用某种xslt函数或甚至是自定义的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>

2 个答案:

答案 0 :(得分:0)

我不认为这可以通过XSLT 1.0完成(但显然2.0可以做到这一点吗?我不太确定,但它并不重要,因为BizTalk和.NET不会这样做#39 ; t支持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;
}

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

答案 1 :(得分:0)

如果这是真的EDI X12,那么进入的文件应该给出ST01中的文件类型。如果您可以将进程配置为检查该字段,则可以区分文件类型。