2015-01-04 1 views
0

XSLT 변환 ... 아래에있는 내입니다 xml 및 xsl이 사용됩니다.다른 노드에서 전체 블록을 복사 - 여기 내가 <strong>(결과)의 전체 블록을 취할</strong> 노드를 시도하고 <strong>결과</strong>라는 또 다른 노드 내부에 배치하고 내가 XSL 코딩에 새로운 오전

그러나 예상대로 자사의 XML을 변환하지 ...

이 사람이 나를 도울 수 는 어디에서 잘못을하고있는 중이 야 ?

XML

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="samplexslt.xsl"?> 
<report> 
<Header> 
<RegNo>123</RegNo> 
<EmrNo>op2145</EmrNo> 
<BillNo>opcb1234-12</BillNo> 
<Uhid>1209</Uhid> 
<AdmissionDate>13-Jan-2014</AdmissionDate> 
</Header> 

<result> 
<name>test1</name> 
<desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
<desc2>description</desc2> 
</result> 
<result> 
<name>test2</name> 
<desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
</result> 

<Footer> 
<DoctorSign>Anand</DoctorSign> 
</Footer> 
</report> 

당신은 그런 식으로 추가 results 블록의 모든 result 블록을 이동할 수 있습니다

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="samplexslt.xsl"?> 
<report> 
<Header> 
<RegNo>123</RegNo> 
<EmrNo>op2145</EmrNo> 
<BillNo>opcb1234-12</BillNo> 
<Uhid>1209</Uhid> 
<AdmissionDate>13-Jan-2014</AdmissionDate> 
</Header> 

<results>  
<result> 
    <name>test1</name> 
    <desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
    <desc2>description</desc2> 
</result> 
<result> 
    <name>test2</name> 
    <desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
</result> 
</results> 

<Footer> 
<DoctorSign>Anand</DoctorSign> 
</Footer> 
</report> 
+1

왜 태그가'XSLT 2.0'입니까? 당신의 스타일 시트는'version = "1.0"'을 선언합니다. –

답변

2

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:template match="/report"> 
<xsl:copy> 
<xsl:apply-templates select="@*|node()[local-name() != 'result']"/> 
</xsl:copy> 
<notes> 
<xsl:apply-templates select="result" /> 
</notes> 
</xsl:template> 

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

예상 :

당신의 입력 XML에 적용

출력 :

<report> 
<Header> 
    <RegNo>123</RegNo> 
    <EmrNo>op2145</EmrNo> 
    <BillNo>opcb1234-12</BillNo> 
    <Uhid>1209</Uhid> 
    <AdmissionDate>13-Jan-2014</AdmissionDate> 
    </Header> 
    <results> 
    <result> 
    <name>test1</name> 
    <desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
    <desc2>description</desc2> 
    </result> 
    <result> 
    <name>test2</name> 
    <desc1>abcdefghijklmnopqrstuvwxyz</desc1> 
    </result> 
    </results> 
    <Footer> 
    <DoctorSign>Anand</DoctorSign> 
    </Footer> 
</report> 

빈 템플릿 <xsl:template match="result[preceding-sibling::result]"/> 경기 결과 노드 앞에 모든 결과 노드, 그래서 <xsl:template match="result"> 일치하는 첫 번째 결과. 다음

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

복사 첫 번째 결과와를 사용하여이 템플릿에서
는 모두 다음과 같은 결과를 mode="copy"와 템플릿을 적용

<xsl:apply-templates select="following::result" mode="copy"/> 

<xsl:template match="result" mode="copy"> 단지 새로운 results 블록 내부에 모두 복사 다음 result 노드를 .

이 접근법은 작동하지만 지나치게 복잡 할 수 있습니다. 입력 된 XML에 알려진 머리글, 결과 및 바닥 글 만 들어있는 경우 michael.hor257k에서 제공 한 자세한 대답에서 제공된 XSLT를 사용하는 것이 좋습니다.

+2

가능한 경우 제공하신 코드에 대한 설명을 조금만 주시겠습니까? – Thavudu

+3

@Thavudu 물론, 이미 사용하고있는 모든 템플릿 (질문에서 코드에서 이미 사용하고있는 ID 변환을 제외하고)을 설명 했으므로 추가 설명을 해주십시오. 이것은 또한 답변을 향상시키는 데 도움이 될 것입니다. –

0

내가 잘못하고있는 사람을 도와 줄 수 있습니까? 따라서 전부 report 요소의 외부 - <xsl:copy> 블록의

<notes> 
    <xsl:apply-templates select="result" /> 
</notes> 

외부 :

당신의 접근 방식의 가장 큰 문제는 (여러 가지가있다) 당신이 명령을 배치 한 것입니다. 머리말과 꼬리말 사이에 결과를 표시하려면 템플릿을 별도로 적용해야합니다. 그 외에는

이, 당신이 원하는 경우 결과가 배치 될 "라는 또 다른 노드 내부 결과"다음 notes 내부를 놓지 마십시오.

XML은 대소 문자를 구분합니다. RESULTS은 예상 출력에 표시된 results과 같은 것이 아닙니다.

것은 이런 식보십시오 :

: 그 모든 스타일 시트가하는 을의 경우,

XSLT 물론 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/report"> 
    <xsl:copy> 
     <xsl:apply-templates select="Header"/> 
     <results> 
      <xsl:apply-templates select="result" /> 
     </results> 
     <xsl:apply-templates select="Footer" /> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

을, 당신은 그것을 줄일 수 XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/report"> 
    <xsl:copy> 
     <xsl:copy-of select="Header"/> 
     <results> 
      <xsl:copy-of select="result" /> 
     </results> 
     <xsl:copy-of select="Footer" /> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet>