Programing

기본 네임 스페이스가 xmlns로 설정된 XML 소스가있는 XSLT

lottogame 2020. 12. 25. 08:50
반응형

기본 네임 스페이스가 xmlns로 설정된 XML 소스가있는 XSLT


루트에 표시된 기본 네임 스페이스가있는 XML 문서가 있습니다. 이 같은:

<MyRoot xmlns="http://www.mysite.com">
   <MyChild1>
       <MyData>1234</MyData> 
   </MyChild1> 
</MyRoot>

XML을 구문 분석하는 XSLT가 기본 네임 스페이스로 인해 예상대로 작동하지 않습니다. 즉, 네임 스페이스를 제거하면 모든 것이 예상대로 작동합니다.

내 XSLT는 다음과 같습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:template match="/" >
  <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
     <NewRoot xmlns="http://wherever.com">
       <NewChild>
         <ChildID>ABCD</ChildID>
         <ChildData>
            <xsl:value-of select="/MyRoot/MyChild1/MyData"/>
         </ChildData>
       </NewChild>
     </NewRoot>
   </soap:Body>
  </soap:Envelope>
 </xsl:template>
</xsl:stylesheet>

번역이 제대로 작동하려면 XSLT 문서로 무엇을해야합니까? XSLT 문서에서 정확히 무엇을해야합니까?


XSLT에서 네임 스페이스를 선언하고 XPath 표현식에서 사용해야합니다. 예 :

<xsl:stylesheet ... xmlns:my="http://www.mysite.com">

   <xsl:template match="/my:MyRoot"> ... </xsl:template>

</xsl:stylesheet>

당신이 참고 해야한다 당신의 XPath에 해당 네임 스페이스의 요소를 참조하려면 몇 가지 접두사를 제공한다. xmlns="..."접두사 없이도 할 수 있고 리터럴 결과 요소에 대해서는 작동하지만 XPath에서는 작동하지 않습니다. XPath에서 접두사가없는 이름은 xmlns="..."범위에 관계없이 항상 빈 URI가있는 네임 스페이스에있는 것으로 간주됩니다 .


XSLT 2.0을 사용 xpath-default-namespace="http://www.example.com"하는 경우 stylesheet섹션 에서 지정 하십시오.


이것이 일종의 이름 공간 문제라면 xslt 파일에서 두 가지를 수정할 여지가 있습니다.

  • xsl : stylesheet 태그에 "my"네임 스페이스 정의 추가
  • xml 파일을 탐색 할 때 요소를 호출 할 때 "my :"접두사를 사용합니다.

결과

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/" >
        <soap:Envelope xsl:version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
                <NewRoot xmlns="http://wherever.com">
                    <NewChild>
                        <ChildID>ABCD</ChildID>
                        <ChildData>
                            <xsl:value-of select="/my:MyRoot/my:MyChild1/my:MyData"/>
                        </ChildData>
                    </NewChild>
                </NewRoot>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>
</xsl:stylesheet>

참조 URL : https://stackoverflow.com/questions/1344158/xslt-with-xml-source-that-has-a-default-namespace-set-to-xmlns

반응형