2012-03-14 37 views
0

我需要使用XSLT将XML中的子节点复制到Biztalk Map中新XML的某个节点上。如何使用Biztalk中的XSLT从XML中复制某个节点(带有子节点),并指定一个自定义名称空间?

考虑下面的输入XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:root xmlns:ns0="http://not/useful/data/"> 
    <ns0:notuseful> 
     <ns0:foo></ns0:foo> 
     <ns0:foo2></ns0:foo2> 
     <ns0:blabla></ns0:blabla> 
    </ns0:notuseful> 
    <ns0:data> 
     <ns1:usefulDataList xmlns:ns1="http://useful/data/"> 
      <ns1:usefulData> 
       <ns1:usefulChild1></ns1:usefulChild1> 
       <ns1:usefulChild2></ns1:usefulChild2> 
       <ns1:usefulChild3></ns1:usefulChild3> 
       <ns1:usefulChild4></ns1:usefulChild4> 
       <ns1:usefulChild5></ns1:usefulChild5> 
      </ns1:usefulData> 
     </ns1:usefulDataList> 
    </ns0:data> 
<ns0:root> 

我需要的是提取称为“usefulDataList”的节点,所以我需要在一个新的XML复制像这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<ns2:root2 xmln:ns2="http://new/xml"> 
    <ns2:blabla> 
     <ns2:stuff /> 
    </ns2:blabla> 
    <ns2:data> 
     <ns2:usefulDataList> 
      <ns2:usefulData> 
       <ns2:usefulChild1></ns2:usefulChild1> 
       <ns2:usefulChild2></ns2:usefulChild2> 
       <ns2:usefulChild3></ns2:usefulChild3> 
       <ns2:usefulChild4></ns2:usefulChild4> 
       <ns2:usefulChild5></ns2:usefulChild5> 
      </ns2:usefulData> 
     </ns2:usefulDataList> 
    </ns2:data> 
</ns2:root2> 

这应该在Biztalk Functoid中完成,因为您看到来自源和目标的名称空间是不同的。

我是一个绝对的初学者使用XSLT,和我一直在做一些测试,但我有毛病我XSLT表达式:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="http://new/xml"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template name="testTemplate" match="//*[local-name() = 'usefulDataList ']"> 
    <xsl:element name="ns0:usefulDataList " namespace=""> 
     <xsl:apply-templates mode="copy-no-ns" select="usefulDataList"/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template mode="copy-no-ns" match="*"> 
    <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates mode="copy-no-ns"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

我会很感激任何提示,使用XSLT或Biztalk映射器。如果我可以用XSLT表达式解决这个问题,我不喜欢逐个链接大量的字段。

问候。

回答

0

当心你在*[local-name() = 'usefulDataList ']"有一个空间,这样就永远不会匹配。这个作品:

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:ns2="http://new/xml"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
<ns2:root> 
    <ns2:blabla> 
    <ns2:stuff /> 
    </ns2:blabla> 
<ns2:data> 
    <xsl:apply-templates mode="copy-no-ns" select="//*[local-name() = 'usefulDataList']"/> 
</ns2:data> 
</ns2:root> 
</xsl:template> 
<xsl:template mode="copy-no-ns" match="*"> 
<xsl:element name="ns2:{local-name(.)}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates mode="copy-no-ns"/> 
</xsl:element> 
</xsl:template> 
</xsl:stylesheet> 
+0

你是对的,这是一个更复杂的XML的样本,我没有注意到这个空间。无论哪种方式,我猜我的模板有什么问题... – Pumba 2012-03-14 17:02:57

+0

你的xslt的另一个主要问题是'”,它在与源相同的名称空间中生成一个元素,请参阅我的答案中的修正版本。 – 2012-03-14 17:07:54

+0

好点,但我生成的XML有一个节点usefulDataList为空:“”。 – Pumba 2012-03-14 17:20:52

相关问题