2013-03-29 1 views
1

내가 태그에 네임 스페이스와 헤더를 추가하여 XML을 대상으로 변경하려면 원본 XML을XSL 네임 스페이스의 사용자 정의 태그를 추가하는 방법

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body> 
<PublishANZINCIDENTESB xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2013-02-25T23:25:35+00:00" transLanguage="EN" baseLanguage="EN" messageID="1361834735434709840" maximoVersion="7 1 20110105-1024 V7118-37" event="1"><ANZINCIDENTESBSet><INCIDENT action="Replace"></INCIDENT></ANZINCIDENTESBSet></PublishANZINCIDENTESB></soapenv:Body></soapenv:Envelope> 

있습니다. 그것은 주위에 내 머리를 점점로

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT" > 
<s600:PublishANZINCIDENTESBOperation> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
</s600:PublishANZINCIDENTESBOperation> 
<xsl:template match="*"> 
    <xsl:element name="s600:{name()}" namespace="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT"> 
    <xsl:copy-of select="namespace::*"/> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

사람이 가능한 한 빨리 좀 도와 주시겠습니까 : 출력 XML은

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header/><soapenv:Body> 
<s600:PublishANZINCIDENTESBOperation><PublishANZINCIDENTESB xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2013-02-25T23:25:35+00:00" transLanguage="EN" baseLanguage="EN" messageID="1361834735434709840" maximoVersion="7 1 20110105-1024 V7118-37" event="1"><ANZINCIDENTESBSet><INCIDENT action="Replace"></INCIDENT></ANZINCIDENTESBSet></PublishANZINCIDENTESB></s600:PublishANZINCIDENTESBOperation></soapenv:Body></soapenv:Envelope> 

내가 사용하고 XSL입니까?

답변

0

입력 및 출력 예제에서는 s600:PublishANZINCIDENTESBOperation 요소를 soapenv:Body의 내용으로 감싸고 그 외에는 내용을 변경하지 않는 것으로 보입니다. 당신은 xmlns:s600 선언이 s600:PublishANZINCIDENTESBOperation 요소보다는 soapenv:Envelope에있을 것입니다 것을 제외하고 당신이 찾고있는 출력을 생성합니다

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:s600="http://LIB_ISM_WPS/S600_PublishANZINCIDENT_Service_INT" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 

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

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

    <!-- If the namespace declaration absolutely _must_ be on the Envelope 
     you could uncomment this extra template --> 
    <!-- 
    <xsl:template match="soapenv:Envelope"> 
    <soapenv:Envelope> 
     <xsl:apply-templates select="@*|node()" /> 
    </soapenv:Envelope> 
    </xsl:template> 
    --> 
</xsl:stylesheet> 

이 이것을 달성 할 수 있지만,이 제공하는 다운 스트림 구성 요소에 문제가되지해야 데이터를 텍스트로 처리하지 않고 적절한 XML 파서를 사용하여 데이터를 처리합니다. 대신 엔벨로프에 선언을하는 것이 정말 중요한 경우 세 번째 템플릿의 주석 처리를 제거하십시오.

+0

위의 xsl을 세 템플릿 모두 첨부하자마자 변환 결과가 없습니다. user2224241

+0

웹 사이트에서 위의 xsl http://xslttest.appspot.com/을 테스트 해 보았습니다. 하지만 결과는 여전히 적절하지 않습니다. – user2224241

+0

@ user2224241 프로세서 구성 방법에 따라'document ('') '트릭이 항상 작동하지 않습니다. 나는 "제 3의 템플렛"의 양자 택일 실시로 응답을 편집했다. –

관련 문제