Как повысить значения в каждой строке 2

<?xml version="1.0" encoding="windows-1251" ?>
 <Сотрудник Нпп="1">
 <Фамилия>***</Фамилия>
 <Имя>***</Имя>
 <Отчество>***</Отчество>
 </Сотрудник>
 <Сотрудник Нпп="2">
 <Фамилия>***</Фамилия>
 <Имя>***</Имя>
 <Отчество>***</Отчество>
 </Сотрудник>
 <Сотрудник Нпп="3">
 <Фамилия>***</Фамилия>
 <Имя>***</Имя>
 <Отчество>***</Отчество>

Добрый вечер! Нужно повысить Нпп на 2000 в каждой строке. Можете помочь?


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Я сделал ваш XML правильно сформированным, добавив корневой элемент.

XSLT использует так называемый шаблон преобразования идентичности (Identity transform pattern).

XML

<?xml version="1.0" encoding="windows-1251"?>
<root>
    <Сотрудник Нпп="1">
        <Фамилия>***</Фамилия>
        <Имя>***</Имя>
        <Отчество>***</Отчество>
    </Сотрудник>
    <Сотрудник Нпп="2">
        <Фамилия>***</Фамилия>
        <Имя>***</Имя>
        <Отчество>***</Отчество>
    </Сотрудник>
    <Сотрудник Нпп="3">
        <Фамилия>***</Фамилия>
        <Имя>***</Имя>
        <Отчество>***</Отчество>
    </Сотрудник>
</root>

XSLT

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no"/>
   <xsl:strip-space elements="*"/>

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

   <xsl:template match="Сотрудник">
      <Сотрудник Нпп="{./@Нпп + 2000}">
         <xsl:apply-templates/>
      </Сотрудник>
   </xsl:template>
</xsl:stylesheet>

c#

void Main()
{
    const string SOURCEXMLFILE = @"e:\temp\input.xml";
    const string XSLTFILE = @"e:\Temp\Process.xslt";
    const string OUTPUTXMLFILE = @"e:\temp\output.xml";

    try
    {
        XsltArgumentList xslArg = new XsltArgumentList();
        
        using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
        {
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());

            XmlWriterSettings settings = xslt.OutputSettings.Clone();
            settings.IndentChars = "\t";
            // to remove BOM
            settings.Encoding = new UTF8Encoding(false);

            using (XmlWriter result = XmlWriter.Create(OUTPUTXMLFILE, settings))
            {
                xslt.Transform(src, xslArg, result, new XmlUrlResolver());
                result.Close();
            }
        }
        Console.WriteLine("Файл '{0}' создан.", OUTPUTXMLFILE);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Результат

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Сотрудник Нпп="2001">
    <Фамилия>***</Фамилия>
    <Имя>***</Имя>
    <Отчество>***</Отчество>
  </Сотрудник>
  <Сотрудник Нпп="2002">
    <Фамилия>***</Фамилия>
    <Имя>***</Имя>
    <Отчество>***</Отчество>
  </Сотрудник>
  <Сотрудник Нпп="2003">
    <Фамилия>***</Фамилия>
    <Имя>***</Имя>
    <Отчество>***</Отчество>
  </Сотрудник>
</root>
→ Ссылка