2017-04-25 45 views
0

我需要根据XML中的属性进行xslt转换。对于带有ed-Cover.i的所有属性,需要在目标xml中创建coverage标签并将其作为子元素映射到它。可以为您请帮我具有属性的XSLT转换

输入XML:

<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> 

预期输出:

<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”和“prem-date”? –

+0

高蒂姆它是可选的,只有当它存在时,我需要创建覆盖预置安置,覆盖预置率和覆盖预置日期和映射它。还请注意元素premum-amt,premium-rate和预约日期不在ed-Cover内。 – Ravi

回答

0

当你想为m元素与“ED-盖”一coverage元素的属性值,你应该改变你的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])" /> 

所以第一个“ED-盖”查找其他元素,以获得保费金额为当前的“ED-封面“你可以做ŝ

<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> 

编辑:如果你不想创建元素;如果值不存在,请尝试使用模板方法

<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>