2013-05-13 5 views
2

그래서 SOAP 문서의 본문에있는 모든 요소를 ​​XSLT를 사용하여 XML로 변환 (추출)하려고합니다. 여기에 (완전한) 내 SOAP 문서SOAP에서 XSLT를 사용하는 XML

<?xml version="1.0" encoding="UTF-8" ?> 
<?xml-stylesheet type="text/xsl" href="dealercode.xsl"?> 

<soap:Envelope 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:Header> 
     <AuthHeader xmlns="http://www.somedomain.com/"> 
      <LogonID></LogonID> 
      <Password></Password> 
     </AuthHeader> 
    </soap:Header> 
    <soap:Body> 
     <getDealerCodeById xmlns="http://www.somedomain.com/"> 
      <BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode> 
      <IDNumber>{dealerCode}</IDNumber> 
     </getDealerCodeById> 
    </soap:Body> 
</soap:Envelope> 

그리고 여기 내 XSLT 시트의입니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<?xml-stylesheet type="text/xsl" href="dealercode2soap.xsl"?> 

    <xsl:template match="/*"> 
<xsl:value-of select="soap:Body/s:getDealerCodeById" 
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
    xmlns:s="http://somedomainname/" /> 

</xsl:stylesheet> 

그러나 출력은 내가 원하는 것이 아니다. 그것은 여전히 ​​"soap : Body"엘리먼트 내에서 내용을 제공하는 대신 전체 SOAP 문서를 파싱하고 "해결되지 않은 네임 스페이스 프리픽스 비누"에 대한 경고를받습니다.

어디서 잘못 되었나요?

편집 : 다른 코드 블록을 사용하여 작동하도록했습니다. 그것은 지금 내 브라우저에서 본문 섹션의 내용을 출력

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns ="http://www.somedomainename.com"> 

<xsl:template match="/"> 
    <xsl:apply-templates select="soap:Envelope/soap:Body/*"/> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

아래를 참조하십시오. 필자가 깨닫은 또 다른 가장 중요한 사실은 서버 측에서 포맷팅이 이루어졌지만 당시 서버에 액세스 할 수 없었기 때문에 코드가 작동하는지 여부를 알 수 없었습니다. 이것은 분명히 전체 시간을 일하는 내가 찾던 원하는 출력 (입니다. 당신은 당신의 XSLT에서 soap 네임 스페이스를 선언하지 않았기 때문에 당신은 " 해결되지 않은 네임 스페이스 접두사 비누"에 대한 경고를 받고

<?xml version="1.0" encoding="UTF-8"?> 
<getDealerCodeById xmlns="http:///" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode> 
    <IDNumber>{dealerCode}</IDNumber> 
</getDealerCodeById> 

답변

2

.

또한, 귀하의 getDealerCodeById 요소는 http://somedomainname/ 이름 공간 URI에 바인드 당신이 눈치 채지 못할 수 있습니다, 그것은 네임 스페이스 접두사를 사용하지 않기 때문에 :. xmlns="http://somedomainname/"

것은 모두를 선언해야합니다을 soap 네임 스페이스와 http://somedomainname/ 네임 스페이스 당신의 XSLT와 어떤 이름 공간 접두사를 사용하도록 XPath를 조정 당신은 선언 : 귀하의 질문의 코드를 수정

<xsl:template match="/*"> 
    <xsl:value-of select="soap:Body/s:getDealerCodeById" 
     xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
     xmlns:s="http://somedomainname/" /> 
</xsl:template> 
+0

도움 Mads에게 감사하지만 작동하지 않는 것 같습니다. 나는 네임 스페이스를 조언했다 (기본적으로 위의 코드를 복사했다.) - 다른 생각은 무엇입니까 ?? – Boyds

+0

그게 효과가있다. 테스트를 통해 doc (유효한 XML이되도록 문서 요소를 만든 후)을 테스트합니다. 유형 -o 또는 다른 네임 스페이스가 혼합되어있을 수 있습니다. 입력 XML 및 XSLT에 대한보다 완벽한 예를 게시 할 수 있습니까? –

+0

비누 네임 스페이스가 선언되지 않은 것에 대해 메모를 다시 읽고 보았습니다. 나는 나의 대답을 업데이트했다. XPath에서 XSLT를 사용할 수 있으려면 XSLT에 모든 네임 스페이스를 선언해야합니다. –

0

우리가 MADS 만들 어떤 대답이 있었는지 질문을 볼 수 있다는 것을 의미한다 스레드를 따르는 것은 매우 어렵습니다. 하지만 코드가있는 상황은 소스 문서와 스타일 시트의 다른 네임 스페이스에 비누 접두사를 바인딩한다는 것입니다. 이는 불법은 아니지만 확실히 혼란스럽고 의도 한 바가 아닌 것입니다. somedomain.com의 네임 스페이스가 일치하지 않습니다.

이 오류의 영향은 스타일 시트에서 아무 것도 출력되지 않는다고 생각됩니다. 스타일 시트는 항상 전체 입력 문서를 구문 분석한다는 의미로 "전체 문서를 구문 분석합니다"라는 것을 알지 못합니다. 입력 된 문서 전체를 출력하고 있다는 것을 의미합니까? 확실히 코드와 일치하지 않는 것 같습니다.

+0

당신은 꽤 괜찮습니다. 아무것도 출력하지 않고 「입력 문서 전체」를 출력하고 있습니다. 어떤 지혜? – Boyds

+0

무엇을 의미합니까? 어떻게 지구에서 아무 것도 출력하지 않고 동시에 입력 문서 전체를 출력 할 수 있습니까? –

+0

내 사과 마이클. 내가 말하고자하는 것은 브라우저에서 출력이 나오지 않는다는 것입니다. – Boyds