将属性从节点添加到父节点

时间:2021-03-22 07:11:55

标签: xslt

在阅读了很多关于这个问题的内容之后,我仍然没有找到我的问题的最终解决方案,因为我是 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>

我希望你们中的一个能帮助我。

干杯, 菲尔

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果我猜对了你真正的目标是什么,你可以简单地做:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="rankings">
    <data>
        <xsl:for-each select="ranking">
            <row>
                <xsl:for-each select=".//@*">
                    <xsl:element name="{name(.)}">
                        <xsl:value-of select="."/>
                    </xsl:element>  
                </xsl:for-each>     
            </row>
        </xsl:for-each>
    </data>
</xsl:template>

</xsl:stylesheet>