我有一个xml,我必须将它转换为另一个xml结构。我尝试了很多方法但没有成功。我需要使用xslt 1.0。我问了一个问题,但是在我问之后格式发生了变化。
输入:
<?xml version="1.0" encoding="ISO-8859-1"?>
<PersonBody>
<Person>
<D>Name</D>
<D>Surname</D>
<D>Id</D>
</Person>
<PersonValues>
<D>Michael</D>
<D>Jackson</D>
<D>01</D>
</PersonValues>
<PersonValues>
<D>James</D>
<D>Bond</D>
<D>007</D>
</PersonValues>
<PersonValues>
<D>Kobe</D>
<D>Bryant</D>
<D>24</D>
</PersonValues>
</PersonBody>
必需的输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
<PersonBody>
<Persons>
<Person>
<Name>Michael</Name>
<Surname>Jackson</Surname>
<Id>1</Id>
</Person>
<Person>
<Name>James</Name>
<Surname>Bond</Surname>
<Id>007</Id>
</Person>
<Person>
<Name>Kobe</Name>
<Surname>Bryant</Surname>
<Id>24</Id>
</Person>
</Persons>
</PersonBody>
答案 0 :(得分:1)
这应该这样做:
<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:key name="kColumnName" match="Person/*"
use="count(preceding-sibling::*)" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<Persons>
<xsl:apply-templates select="PersonValues" />
</Persons>
</xsl:copy>
</xsl:template>
<xsl:template match="PersonValues">
<Person>
<xsl:apply-templates select="*" />
</Person>
</xsl:template>
<xsl:template match="PersonValues/*">
<xsl:element name="{key('kColumnName', position() - 1)}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行时,结果为:
<PersonBody>
<Persons>
<Person>
<Name>Michael</Name>
<Surname>Jackson</Surname>
<Id>01</Id>
</Person>
<Person>
<Name>James</Name>
<Surname>Bond</Surname>
<Id>007</Id>
</Person>
<Person>
<Name>Kobe</Name>
<Surname>Bryant</Surname>
<Id>24</Id>
</Person>
</Persons>
</PersonBody>