多个子到父 - XSLT程序

时间:2014-05-14 14:47:13

标签: xslt

我是XSLT编程的新手,请大家帮我解决下面的请求?

这就是它

<File attrib1="100"  attrib2="200">
 <FileHeader attrib3="a" attrib4="5">
  <item attrib5="34" attrib6="3">
     <subitem1/>
     <subitem2/>
  </item>
  <item attrib5="156" attrib6="170">
     <subitem1/>
     <subitem2/>
  </item>
 </FileHeader>
</File>

我想将其转换为

<File attrib1="100"  attrib2="200">
  <item attrib5="34" attrib6="3">
     <subitem1/>
     <subitem2/>
  </item>
  <item attrib5="156" attrib6="170">
     <subitem1/>
     <subitem2/>
  </item>
  <FileHeader attrib3="a" attrib4="5">
  </FileHeader>
</File>

下面是我写的代码,似乎项目为每个项目重复多次:

 <xsl:template match="/">
 <File>
  <xsl:attribute name="attrib1">
    <xsl:value-of select="File/@attrib1"/>
  </xsl:attribute>
  <xsl:attribute name="attrib2">
    <xsl:value-of select="File/@attrib2"/>
  </xsl:attribute>

  <xsl:for-each select="File/FileHeader/item">
    <xsl:copy-of select="//Item[@*]"/>
  </xsl:for-each>

  <FileHeader>
    <xsl:attribute name="attrib3">
      <xsl:value-of select="/File/FileHeader/@attrib3"/>
    </xsl:attribute>
    <xsl:attribute name="attrib4">
      <xsl:value-of select="/File/FileHeader/@attrib4"/>
    </xsl:attribute>
  </FileHeader>
</File>
</xsl:template>

谢谢我想出来,下面的工作正常。

 <xsl:template match="/">
 <File>
  <xsl:attribute name="attrib1">
    <xsl:value-of select="File/@attrib1"/>
  </xsl:attribute>
  <xsl:attribute name="attrib2">
    <xsl:value-of select="File/@attrib2"/>
  </xsl:attribute>

    <xsl:copy-of select="//Item[@*]"/>


  <FileHeader>
    <xsl:attribute name="attrib3">
      <xsl:value-of select="/File/FileHeader/@attrib3"/>
    </xsl:attribute>
    <xsl:attribute name="attrib4">
      <xsl:value-of select="/File/FileHeader/@attrib4"/>
    </xsl:attribute>
  </FileHeader>
</File>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

您可以为此编写一个更简单的模板。您无需显式复制属性:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="File">
        <xsl:copy>
           <xsl:copy-of select="@*|FileHeader/item"/>
           <xsl:apply-templates select="FileHeader"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*|FileHeader">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>