2012-05-09 4 views
2

XSLT를 사용하여 변환해야하는 XML이 있습니다. XML에 해결되지 않은 맞춤 태그가 있으며 그 결과를 얻지 못했습니다.XSLT 변환에서 작동하지 않는 사용자 정의 태그

<?xml version="1.0" encoding="UTF-16"?> 
<di:itg_dataImport xmlns:di="http://www.mercury.com/itg/data_import/1.0" 
        xmlns = "http://www.mercury.com/itg/dm/2.0/types" 
        xmlns:common = "http://www.mercury.com/itg/common/2.0/types" 
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd"> 
    <request> 
    <requestType>Project Issue</requestType> 
    <identifier>3</identifier> 
    <common:simpleField> 
     <common:token>REQ.ASSIGNED_TO_USER_ID</common:token> 
     <common:stringValue>Admin User (DEV)</common:stringValue> 
    </common:simpleField> 
    <common:simpleField> 
     <common:token>REQ.DESCRIPTION</common:token> 
     <common:stringValue>Test - Pls Ignore</common:stringValue> 
    </common:simpleField> 
    <common:simpleField> 
     <common:token>REQ.KNTA_ESCALATION_LEVEL</common:token> 
     <common:stringValue>Project</common:stringValue> 
    </common:simpleField> 
    <common:simpleField> 
     <common:token>REQ.KNTA_MASTER_PROJ_REF</common:token> 
     <common:stringValue>P0912002 IPTV Residential Phase 1</common:stringValue> 
    </common:simpleField> 
    <common:simpleField> 
     <common:token>REQ.PRIORITY_CODE</common:token> 
     <common:stringValue>Normal</common:stringValue> 
    </common:simpleField> 
    <common:simpleField> 
     <common:token>REQ.WORKFLOW_ID</common:token> 
     <common:stringValue>Issue Management Process</common:stringValue> 
    </common:simpleField> 
    </request> 

</di:itg_dataImport> 

XSLT가 호출되고 다음과 같습니다 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:di="http://www.mercury.com/itg/data_import/1.0" 
        xmlns = "http://www.mercury.com/itg/dm/2.0/types" 
        xmlns:common = "http://www.mercury.com/itg/common/2.0/types" 
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" > 

<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
<requests> 
    <request> 
    <requestType> 
    <xsl:copy-of select="di:itg_dataImport/request/requestType"/> 
    </requestType> 

    </request> 
</requests> 

</xsl:template> 
</xsl:stylesheet> 

원하는 출력은 다음과 같습니다

프로젝트 이슈는

사람은 도움을 주시기 바랍니다 수

다음

XML 코드입니다 내가 잘못 가고있는 곳을 찾아 내고 가리키는 데. 감사

답변

1

XSL 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:di="http://www.mercury.com/itg/data_import/1.0" 
    xmlns = "http://www.mercury.com/itg/dm/2.0/types" 
    xmlns:common = "http://www.mercury.com/itg/common/2.0/types" 
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" > 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <requests> 
      <request> 
       <xsl:for-each select="descendant::*[local-name() = 'requestType']"> 
        <requestType> 
         <xsl:value-of select="text()"/> 
        </requestType> 
       </xsl:for-each> 
      </request> 
     </requests> 
    </xsl:template> 
</xsl:stylesheet> 

결과-문서

<?xml version="1.0" encoding="utf-8"?> 
<requests xmlns="http://www.mercury.com/itg/dm/2.0/types" xmlns:di="http://www.mercury.com/itg/data_import/1.0" xmlns:common="http://www.mercury.com/itg/common/2.0/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <request> 
     <requestType>Project Issue</requestType> 
    </request> 
</requests> 
+1

이 방법이 효과가 있지만 저는 개인적으로 사람들에게 코드에 무엇이 잘못된 것인지 알려주고 단순히 대안 솔루션을 제공하는 것보다 선호합니다. 그렇게하면 약간 다른 문제에 대해 동일한 실수를 다시 할 때 도움을 받기 위해 다시 올 가능성이 적습니다. –

1

그것은 번호를 하나의 XSLT 코딩 오류입니다 : 당신의 요소가 (기본) 네임 스페이스에 있으며, 네임 스페이스를 선택할 때 지정하지 않았습니다.

+0

+1, 나는이 분야에서 매우 초보자이며, 당신의 책을 읽는 지식을 수집하고 있습니다.선생님, 근본 원인을 보여 주셔서 대단히 감사합니다. – Cylian

1

마이클 케이가 제대로 여기에 더욱 명시 적으로 가리키는 기본 네임 스페이스에서 문서 작업을하는 방법이 무엇인지 확인하려면 - 특정 경우 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:di="http://www.mercury.com/itg/data_import/1.0" 
        xmlns:x = "http://www.mercury.com/itg/dm/2.0/types" 
        xmlns:common = "http://www.mercury.com/itg/common/2.0/types" 
        xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd" > 

<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
<requests> 
    <request> 
    <requestType> 
    <xsl:copy-of select="di:itg_dataImport/x:request/x:requestType"/> 
    </requestType> 

    </request> 
</requests> 
</xsl:template> 
</xsl:stylesheet> 

내가 몇 짧은 만든 원래 코드 변경 :

  1. XSLT 스타일 시트는 더 이상 기본 네임 스페이스를 가지고는 - 대신은 접두사로 지정한 것과 같은 네임 스페이스를 가지고있다.

  2. selectxsl:copy-of 속성에는 모든 이름 앞에 접두어가 붙습니다. 원하는 정확한 결과가 생성됩니다

    <di:itg_dataImport xmlns:di="http://www.mercury.com/itg/data_import/1.0" 
            xmlns = "http://www.mercury.com/itg/dm/2.0/types" 
            xmlns:common = "http://www.mercury.com/itg/common/2.0/types" 
            xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.mercury.com/itg/data_import/1.0 data_import.xsd"> 
        <request> 
        <requestType>Project Issue</requestType> 
        <identifier>3</identifier> 
        <common:simpleField> 
         <common:token>REQ.ASSIGNED_TO_USER_ID</common:token> 
         <common:stringValue>Admin User (DEV)</common:stringValue> 
        </common:simpleField> 
        <common:simpleField> 
         <common:token>REQ.DESCRIPTION</common:token> 
         <common:stringValue>Test - Pls Ignore</common:stringValue> 
        </common:simpleField> 
        <common:simpleField> 
         <common:token>REQ.KNTA_ESCALATION_LEVEL</common:token> 
         <common:stringValue>Project</common:stringValue> 
        </common:simpleField> 
        <common:simpleField> 
         <common:token>REQ.KNTA_MASTER_PROJ_REF</common:token> 
         <common:stringValue>P0912002 IPTV Residential Phase 1</common:stringValue> 
        </common:simpleField> 
        <common:simpleField> 
         <common:token>REQ.PRIORITY_CODE</common:token> 
         <common:stringValue>Normal</common:stringValue> 
        </common:simpleField> 
        <common:simpleField> 
         <common:token>REQ.WORKFLOW_ID</common:token> 
         <common:stringValue>Issue Management Process</common:stringValue> 
        </common:simpleField> 
        </request> 
    
    </di:itg_dataImport> 
    

    :

    <requests xmlns:di="http://www.mercury.com/itg/data_import/1.0" xmlns:x="http://www.mercury.com/itg/dm/2.0/types" xmlns:common="http://www.mercury.com/itg/common/2.0/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
        <request> 
         <requestType> 
          <requestType xmlns="http://www.mercury.com/itg/dm/2.0/types">Project Issue</requestType></requestType> 
        </request> 
    </requests> 
    

    규칙이 기억이 변환이 제공된 XML 문서에 적용

: XPath는 접두어가없는 이름을 "이름 없음"으로 처리합니다. 공간". 이를 처리하려면 XSLT 코드에서이 네임 스페이스를 정의하고 접두어로 -이 접두어로 접두어를 붙입니다.

+0

+1, unputdownable! – Cylian

+0

@Cylian : 천만에요. –

관련 문제