首页 > 解决方案 > 将属性从节点添加到父节点

问题描述

在阅读了很多关于这个问题的内容之后,我仍然没有找到我的问题的最终解决方案,因为我是 xsl 的绝对初学者。

我想将子节点的所有属性添加到父级别。

这就是我所拥有的:

 <rankings date="2021-03-15">
<ranking rank="1" rank_change="0" points="12008">
  <player initials="" nationality="SRB" last_name="Djokovic" first_name="Novak" id="7" display_name="Novak Djokovic"/>
</ranking>
<ranking rank="2" rank_change="1" points="9940">
  <player initials="" nationality="RUS" last_name="Medvedev" first_name="Daniil" id="35844" display_name="Daniil Medvedev"/>
</ranking>
<ranking rank="3" rank_change="-1" points="9670">
  <player initials="" nationality="ESP" last_name="Nadal" first_name="Rafael" id="4" display_name="Rafael Nadal"/>
</ranking>
</rankings>

这就是我尝试过的(我认为想念身份转换)

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

  <xsl:template match="rankings">
    <data>
      <xsl:apply-templates select="*"/>
    </data>
  </xsl:template>

 <xsl:template match="ranking | player">
    <row>
        
        <xsl:apply-templates select="@* | node()"/>
        
    </row>
  </xsl:template>


  <xsl:template match="ranking/@* | player/@*">
    <xsl:element name="{name(.)}">
    <xsl:value-of select="."/>
    </xsl:element>  
  </xsl:template>
  
</xsl:stylesheet>

结果如下:

<data>
    <row>
       <rank>1</rank>
       <rank_change>0</rank_change>
       <points>12008</points>
       <row>
           <initials/>
           <nationality>SRB</nationality>
           <last_name>Djokovic</last_name>
           <first_name>Novak</first_name>
           <id>7</id>
          <display_name>Novak Djokovic</display_name>
     </row>
</row>
</data>

这是我的目标:

<data>
    <row>
       <rank>1</rank>
       <rank_change>0</rank_change>
       <points>12008</points>
       <initials/>
       <nationality>SRB</nationality>
       <last_name>Djokovic</last_name>
       <first_name>Novak</first_name>
       <id>7</id>
       <display_name>Novak Djokovic</display_name>
</row>
</data>

我希望你们中的一个可以帮助我解决这个问题。

干杯,菲尔

标签: xslt

解决方案


尝试在自己的模板中拆分排名和玩家

<xsl:template match="ranking">
  <row>
    <xsl:apply-templates select="@* | node()"/>
  </row>
</xsl:template>

<xsl:template match="player">
  <xsl:apply-templates select="@* | node()"/>
</xsl:template>

结果:

<data>
   <row>
      <rank>1</rank>
      <rank_change>0</rank_change>
      <points>12008</points>
      <initials/>
      <nationality>SRB</nationality>
      <last_name>Djokovic</last_name>
      <first_name>Novak</first_name>
      <id>7</id>
      <display_name>Novak Djokovic</display_name>
   </row>
   <row>
      <rank>2</rank>
      <rank_change>1</rank_change>
      <points>9940</points>
      <initials/>
      <nationality>RUS</nationality>
      <last_name>Medvedev</last_name>
      <first_name>Daniil</first_name>
      <id>35844</id>
      <display_name>Daniil Medvedev</display_name>
   </row>
   <row>
      <rank>3</rank>
      <rank_change>-1</rank_change>
      <points>9670</points>
      <initials/>
      <nationality>ESP</nationality>
      <last_name>Nadal</last_name>
      <first_name>Rafael</first_name>
      <id>4</id>
      <display_name>Rafael Nadal</display_name>
   </row>
</data>

推荐阅读