我一直在论坛上搜索我的问题的答案,没有任何运气。我希望你能帮助我。我有一个简单的CSV文件,我需要转换为XML(这部分很容易),但我需要修改它,以便它包含子元素。例如:
我有什么:
<Unit>
<UnitID>K000009107</UnitID>
<DateLastModified>2003-06-23</DateLastModified>
<Family>SAPOTACEAE</Family>
<Genus>Pouteria</Genus>
<Species>ferrugineo-tomentos</Species>
<Identifier>Smith, J</Identifier>
<StartMonth>05</StartMonth>
<StartYear>1997</StartYear>
<TypeStatus>Type</TypeStatus>
</Unit>
我需要什么:
<Unit>
<UnitID>K000009107</UnitID>
<DateLastModified>2003-06-23</DateLastModified>
<Identification StoredUnderName="true">
<Family>SAPOTACEAE</Family>
<Genus>Pouteria</Genus>
<Species>ferrugineo-tomentos</Species>
<Identifier>Smith, J</Identifier>
<IdentificationDate>
<StartMonth>05</StartMonth>
<StartYear>1997</StartYear>
</IdentificationDate>
<TypeStatus>Type</TypeStatus>
</Identification>
</Unit>
我需要在大型数据集上进行此修改。我猜XSLT会完成这项工作,但我无法弄清楚这是如何工作的。有什么想法吗?
答案 0 :(得分:0)
以下是执行此操作的一种方法:
<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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="UnitID|DateLastModified"/>
<Identification StoredUnderName="true">
<xsl:apply-templates select=
"*[not(contains('|UnitID|DateLastModified|StartMonth|StartYear|TypeStatus|',
concat('|',name(),'|')))]"/>
<IdentificationDate>
<xsl:apply-templates select="StartMonth|StartYear"/>
</IdentificationDate>
<xsl:apply-templates select="TypeStatus"/>
</Identification>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Unit>
<UnitID>K000009107</UnitID>
<DateLastModified>2003-06-23</DateLastModified>
<Family>SAPOTACEAE</Family>
<Genus>Pouteria</Genus>
<Species>ferrugineo-tomentos</Species>
<Identifier>Smith, J</Identifier>
<StartMonth>05</StartMonth>
<StartYear>1997</StartYear>
<TypeStatus>Type</TypeStatus>
</Unit>
产生了想要的正确结果:
<Unit>
<UnitID>K000009107</UnitID>
<DateLastModified>2003-06-23</DateLastModified>
<Identification StoredUnderName="true">
<Family>SAPOTACEAE</Family>
<Genus>Pouteria</Genus>
<Species>ferrugineo-tomentos</Species>
<Identifier>Smith, J</Identifier>
<IdentificationDate>
<StartMonth>05</StartMonth>
<StartYear>1997</StartYear>
</IdentificationDate>
<TypeStatus>Type</TypeStatus>
</Identification>
</Unit>
这种转变可以缩短一点,但会失去灵活性:
<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="/*">
<xsl:copy>
<xsl:copy-of select="UnitID|DateLastModified"/>
<Identification StoredUnderName="true">
<xsl:copy-of select=
"*[not(contains('|UnitID|DateLastModified|StartMonth|StartYear|TypeStatus|',
concat('|',name(),'|')))]"/>
<IdentificationDate>
<xsl:copy-of select="StartMonth|StartYear"/>
</IdentificationDate>
<xsl:copy-of select="TypeStatus"/>
</Identification>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>