【问题标题】:XSLT Transformation can't get right number of Tags/NodesXSLT 转换无法获得正确数量的标签/节点
【发布时间】:2016-11-04 20:22:58
【问题描述】:

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

希望你能帮忙。

【问题讨论】:

  • 为什么不发布您的尝试以便我们修复它,而不必从头开始为您编写代码。

标签: xslt xslt-1.0


【解决方案1】:

只需去掉最后一个模板,取出dataroot模板的&lt;xsl:copy&gt;标签即可:

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

【讨论】:

  • @GregK - 查看更新的 XSLT 以去除输出中的命名空间。
  • 我不自称理解代码,但工作就像一个魅力。
  • 太棒了!基本上第一个模板,基于身份模板只提取节点的本地名称,而忽略特殊的命名空间。最后一个模板仅返回来自具有文本值的节点的文本值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多