如何使用XSLT使用其第一个属性的值重命名XML元素?

时间:2016-07-09 13:30:55

标签: xslt rename element

我是XSLT的新手,并且XML结构看起来像这样:

  <Loop LoopId="1000A" Name="SUBMITTER NAME">
  .... a bunch of sub-elements, etc. 
  </Loop>

我正在尝试编写一个将它们全部转换为此的XSLT: (将LoopId属性的值连接到其父元素名称)

  <Loop1000A LoopId="1000A" Name="SUBMITTER NAME">
  .... a bunch of sub-elements, etc. 
  </Loop1000A>

我有一个样式表几乎可以让我一路走来,但是它摆脱了LoopId属性,我不知道为什么 - 下面的样式表产生了这个结果:

  <Loop1000A Name="SUBMITTER NAME">
  .... a bunch of sub-elements, etc. 
  </Loop1000A>

有没有办法修改它,所以我保留LoopId属性?

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

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

  <xsl:template match="@LoopId"/>

  <xsl:template match="*[@LoopId]">
     <xsl:variable name="vRep" select="concat('Loop',@LoopId)"/>
    <xsl:element name="{$vRep}">
      <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

由于

2 个答案:

答案 0 :(得分:1)

变化:

<xsl:element name="{concat('Loop', @LoopId)}">

为:

    static void Main(string[] args)
    {
        int input = int.Parse(Console.ReadLine());
        int zeroes = 0;

        List<int> myList = ATM(input);

        foreach(var number in myList.ToArray())
        {
            if (number != 0)
            {
                myList.AddRange(ATM(number));
            }
            else
            {
                continue;
            }
        }

        foreach (var zero in myList)
        {
            if (zero == 0)
            {
                zeroes += 1;
            }
        }

        Console.WriteLine(zeroes);
        Console.ReadKey();


        Console.ReadKey();
    }

    static List<int> ATM(int value)
    {
        List<int> exchangeCoins = new List<int>();

        if (value != 0)
        {
            exchangeCoins.Add(value / 2);
            exchangeCoins.Add(value / 3);
            exchangeCoins.Add(value / 4);
        }
       else
        {
            throw new Exception("Value can't be zero!");
        }

        return exchangeCoins;

    }
}

请参阅: https://www.w3.org/TR/xslt/#attribute-value-templates

答案 1 :(得分:1)

删除模板<xsl:template match="@LoopId"/>,就像删除LoopId属性一样。