2017-04-25 6 views
0

XML에서 속성을 기반으로 xslt 변환을 수행해야합니다. ed-Cover.i가있는 모든 속성에 대해 대상 XML에 적용 태그를 작성하고 요소를 하위 요소로 매핑해야합니다.XSLT 속성을 사용하여 변환

<c> 
<m p='ed-Cover'></m> 
<m p='premum-amt' v='100'></m> 
<m p='premium-rate' v='10'></m> 
<m p='prem-date' v='10-04-15'></m> 
<m p='ed-Cover'></m> 
<m p='premum-amt' v='50'></m> 
<m p='premium-rate' v='5'></m> 
<m p='prem-date' v='12-03-15'></m> 
<m p='ed-Cover'></m> 
<m p='premum-amt' v='75'></m> 
<m p='premium-rate' v='7'></m> 
<m p='prem-date' v='3-05-15'></m> 
</c> 

XSLT :

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

<xsl:template match="/"> 
    <coverages> 
<xsl:for-each select="c/m"> 
</xsl:for-each> 
</coverages> 
</xsl:template> 
</xsl:stylesheet> 

예상 출력 :

나에게

입력 XML을 도와주세요 당신은 속성 값으로 "ED 표지"와 m 요소에 대한 coverage 요소를 원하는대로

<coverages> 
<coverage> 
<coverage-prem-amt>100</coverage-prem-amt> 
<coverage-prem-rate>10</coverage-prem-rate> 
<coverage-prem-date>10-04-15</coverage-prem-date> 
</coverage> 
<coverage> 
<coverage-prem-amt>50</coverage-prem-amt> 
<coverage-prem-rate>5</coverage-prem-rate> 
<coverage-prem-date>12-03-15</coverage-prem-date> 
</coverage> 
<coverage> 
<coverage-prem-amt>75</coverage-prem-amt> 
<coverage-prem-rate>7</coverage-prem-rate> 
<coverage-prem-date>3-05-15</coverage-prem-date> 
</coverage> 
<coverages> 
+0

항상 'premum-amt','prem 'ed-Cover'에 대한 XML에있는'ium-rate'과'pre-date'가 있습니까? –

+0

안녕하세요, 그것은 단지 내가 존재하는 경우 선택 사항입니다, 나는 범위 - 전제 - 보상, 전율 및 보상 전제를 만들고 그것을지도로 만들 필요가 있습니다. 또한 요소 premum-amt, premium-rate 및 Prem-date는 ed-Cover 안에 있지 않습니다. – Ravi

답변

0

, 당신의 형제입니다 당신이 필요로하는 값을 얻을 수 있도록 xsl:for-each

<xsl:for-each select="c/m[@p='ed-Cover']"> 

로 변경해야 당신은, 그래서 그들에게

<xsl:key name="cover" match="m" use="generate-id(preceding-sibling::m[@p='ed-Cover'][1])" /> 

앞에있는 최초의 "드 커버"에 따라 다른 요소를 조회 할 수있는 현재의 "드 커버를위한 프리미엄 양을 얻을 수 있도록이 요소는이 키를 가지고 도움이 될 수 있습니다 "너는 할 수있어.

<xsl:variable name="id" select="generate-id()" /> 

<coverage-prem-amt> 
    <xsl:value-of select="key('cover', $id)[@p='premum-amt']/@v" /> 
</coverage-prem-amt> 

이 XSLT에게

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

    <xsl:key name="cover" match="m" use="generate-id(preceding-sibling::m[@p='ed-Cover'][1])" /> 

    <xsl:template match="/"> 
    <coverages> 
     <xsl:for-each select="c/m[@p='ed-Cover']"> 
     <xsl:variable name="id" select="generate-id()" /> 
     <coverage> 
      <coverage-prem-amt> 
      <xsl:value-of select="key('cover', $id)[@p='premum-amt']/@v" /> 
      </coverage-prem-amt> 
      <coverage-prem-rate> 
      <xsl:value-of select="key('cover', $id)[@p='premium-rate']/@v" /> 
      </coverage-prem-rate> 
      <coverage-prem-date> 
      <xsl:value-of select="key('cover', $id)[@p='prem-date']/@v" /> 
      </coverage-prem-date> 
     </coverage> 
     </xsl:for-each> 
    </coverages> 
    </xsl:template> 
</xsl:stylesheet> 

편집을 시도 S :

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

    <xsl:key name="cover" match="m" use="generate-id(preceding-sibling::m[@p='ed-Cover'][1])" /> 

    <xsl:template match="/"> 
    <coverages> 
     <xsl:for-each select="c/m[@p='ed-Cover']"> 
     <xsl:variable name="id" select="generate-id()" /> 
     <coverage> 
      <xsl:apply-templates select="key('cover', $id)[@p='premum-amt']" /> 
      <xsl:apply-templates select="key('cover', $id)[@p='premium-rate']" /> 
      <xsl:apply-templates select="key('cover', $id)[@p='prem-date']" /> 
     </coverage> 
     </xsl:for-each> 
    </coverages> 
    </xsl:template> 

    <xsl:template match="m[@p='premum-amt']"> 
    <coverage-prem-amt> 
     <xsl:value-of select="@v" /> 
    </coverage-prem-amt> 
    </xsl:template> 

    <xsl:template match="m[@p='premium-rate']"> 
    <coverage-prem-rate> 
     <xsl:value-of select="@v" /> 
    </coverage-prem-rate> 
    </xsl:template> 

    <xsl:template match="m[@p='prem-date']"> 
    <coverage-prem-date> 
     <xsl:value-of select="@v" /> 
    </coverage-prem-date> 
    </xsl:template> 
</xsl:stylesheet> 
+0

이것은 내가 예상했던 것, 빠른 응답을위한 많은 Tim 감사합니다. – Ravi

0

이 일하는 것이 당신이 값이 존재하지 않는 경우 요소를 생성하지 않으려면, 템플릿 접근 방식을 시도 너무 :

<xsl:template match="c"> 
    <xsl:element name="coverages"> 
     <xsl:apply-templates select="m[@p='premum-amt']"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="m[@p='premum-amt']"> 
    <xsl:element name="coverage"> 
     <xsl:element name="coverage-prem-amt"> 
     <xsl:value-of select="@v"/> 
     </xsl:element> 
     <xsl:element name="coverage-prem-rate"> 
     <xsl:value-of select="following-sibling::m[@p='premium-rate'][1]/@v"/> 
     </xsl:element> 
     <xsl:element name="coverage-prem-date"> 
     <xsl:value-of select="following-sibling::m[@p='prem-date'][1]/@v"/> 
     </xsl:element> 
    </xsl:element> 
    </xsl:template>