XSLT转换无法获得正确数量的标签/节点

时间:2016-11-04 20:22:58

标签: xslt xslt-1.0

我是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>

希望你能提供帮助。

1 个答案:

答案 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>