사용자 정의 네임 스페이스를 지정하는 BizTalk에서 xslt로 XSLT로 XML에서 특정 노드 (자식 포함)를 복사하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/9705891

  •  14-12-2019
  •  | 
  •  

문제

XSLT를 사용하여 BizTalk Map에서 XML에서 새 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>
.

내가 필요한 것은 "유용한"이라는 노드를 추출하는 것 뿐이므로 새로운 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 Mapper를 사용하여 모든 팁을 주셔서 감사합니다.XSLT 표현식으로 해결할 수있는 경우 큰 양의 필드를 하나씩 연결하는 것이 좋습니다.

인사말.

도움이 되었습니까?

해결책

*[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>
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top