我是XSL的新手,我找不到像以下情况一样的地方。我想将source.xml转换为target.xml。我使用模式“组”但它对我不起作用(可能我无法正确使用它)
source.xml:
<?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>
target.xml:
<PersonBody>
<AllValues>
<Name>
<D>Michael</D>
<D>James</D>
<D>Kobe</D>
</Name>
<Surname>
<D>Jackson</D>
<D>Bond</D>
<D>Bryant</D>
</Surname>
<Id>
<D>01</D>
<D>007</D>
<D>24</D>
</Id>
</AllValues>
</PersonBody>
编辑:我问了另一个问题因为输出已经改变了。
您可以在here 中找到其他问题
答案 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="kColumnValue" match="PersonValues/*"
use="count(preceding-sibling::*)" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<AllValues>
<xsl:apply-templates select="Person/*" />
</AllValues>
</xsl:copy>
</xsl:template>
<xsl:template match="Person/*">
<xsl:element name="{.}">
<xsl:apply-templates select="key('kColumnValue', position() - 1)" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在样本XML上运行时,结果为:
<PersonBody>
<AllValues>
<Name>
<D>Michael</D>
<D>James</D>
<D>Kobe</D>
</Name>
<Surname>
<D>Jackson</D>
<D>Bond</D>
<D>Bryant</D>
</Surname>
<Id>
<D>01</D>
<D>007</D>
<D>24</D>
</Id>
</AllValues>
</PersonBody>