转换XML替换节点

时间:2017-05-09 18:20:07

标签: xml xslt xpath

我需要转换XML。我试过XSLT转换失败了。我是新人。

来源:

<md>    
<mi>     
  <mt>rock</mt>
  <mt>classic</mt>
  <mt>pop</mt>
  <mv>
    <moid>blue</moid>
    <r>2</r>
    <r>4</r>
    <r>6</r>
  </mv>
  <mv>
    <moid>yellow</moid>
    <r>1</r>
    <r>5</r>
    <r>33</r>
  </mv>
  <mv>
    <moid>green</moid>
    <r>22</r>
    <r>0</r>
    <r>10</r>
  </mv>
</mi>
</md>

目标:

<md>    
<mi>     
  <mt>rock</mt>
  <mt>classic</mt>
  <mt>pop</mt>
  <mv>
    <moid>blue</moid>
    <rock>2</rock>
    <classic>4</classic>
    <pop>6</pop>
  </mv>
  <mv>
    <moid>yellow</moid>
    <rock>1</rock>
    <classic>5</classic>
    <pop>33</pop>
  </mv>
  <mv>
    <moid>green</moid>
    <rock>22</rock>
    <classic>0</classic>
    <pop>10</pop>
  </mv>     
</mi>
</md>

基本上,我需要根据位置用'mt节点的正确值替换'r'tag节点。 例如,第一个'r'标记节点(值为2的节点)必须替换为标记'rock'。 任何关于解决方案的建议都会受到赞赏。 谢谢和最诚挚的问候, GAV。

1 个答案:

答案 0 :(得分:2)

这是你可以看到它的一种方式:

XSLT 1.0

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

<xsl:key name="cat" match="mt" use="count(preceding-sibling::mt)" />

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

<xsl:template match="r">
    <xsl:element name="{key('cat', count(preceding-sibling::r))}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element >
</xsl:template>

</xsl:stylesheet>