我是XSLT和XML的新手,我无法正确地进行转换。在网上使用示例我最终会丢失标签或节点(我不确定术语)或者它们是重复的。下面是输入和所需输出的样本。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-11-04T15:53:41">
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>122</KpiId>
<Value>4418.88</Value>
</ActualKPIDay>
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>121</KpiId>
<Value>44.35</Value>
</ActualKPIDay>
<ActualKPIDay>
<XrefCode>Whitby</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>121</KpiId>
<Value>46.75</Value>
</ActualKPIDay>
</dataroot>
期望的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ActualKPIDayImport>
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>122</KpiId>
<Value>4418.88</Value>
</ActualKPIDay>
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>121</KpiId>
<Value>44.35</Value>
</ActualKPIDay>
<ActualKPIDay>
<XrefCode>Whitby</XrefCode>
<DayId>2016-11-03</DayId>
<KpiId>121</KpiId>
<Value>46.75</Value>
</ActualKPIDay>
</ActualKPIDayImport>
我最近的尝试导致离开“dataroot”行并在每条记录之前和之后复制“ActualKPIDay”标记:
代码尝试:
xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="@* | node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="dataroot">
<xsl:copy>
<ActualKPIDayImport>
<xsl:apply-templates/>
</ActualKPIDayImport>
</xsl:copy>
</xsl:template>
<xsl:template match="ActualKPIDay">
<ActualKPIDay>
<xsl:call-template name="identity"/>
</ActualKPIDay>
</xsl:template>
</xsl:stylesheet>
输出结果:
<?xml version="1.0"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata">
<ActualKPIDayImport>
<ActualKPIDay>
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03T00:00:00</DayId>
<KpiId>122</KpiId>
<Value>4418.88</Value>
</ActualKPIDay>
</ActualKPIDay>
<ActualKPIDay>
<ActualKPIDay>
<XrefCode>Etobicoke</XrefCode>
<DayId>2016-11-03T00:00:00</DayId>
<KpiId>121</KpiId>
<Value>44.35</Value>
</ActualKPIDay>
</ActualKPIDay>
<ActualKPIDay>
<ActualKPIDay>
<XrefCode>Georgetown</XrefCode>
<DayId>2016-11-03T00:00:00</DayId>
<KpiId>121</KpiId>
<Value>425.29</Value>
</ActualKPIDay>
</ActualKPIDay>
</ActualKPIDayImport>
</dataroot>
希望你能提供帮助。
答案 0 :(得分:0)
只需删除最后一个模板,然后取出数据对象模板的<xsl:copy>
标记:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="dataroot" priority="1">
<ActualKPIDayImport>
<xsl:apply-templates/>
</ActualKPIDayImport>
</xsl:template>
<xsl:template match="text()" priority="2">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>