我需要转换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。
答案 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>