通过xslt或C#代码添加xml节点

通过xslt或C#代码添加xml节点,c#,asp.net,xml,xslt,C#,Asp.net,Xml,Xslt,我有一个输入xml,如下所示 <?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> <root> <employee> <firstname>Kaushal</firstname> <lastname>Parik</lastname> <

我有一个输入xml,如下所示

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<root>
  <employee>
    <firstname>Kaushal</firstname>
    <lastname>Parik</lastname>
  </employee>
  <employee>
    <firstname>Abhishek</firstname>
    <lastname>Swarnkar</lastname>
  </employee>
</root>
非常感谢您的帮助……

您的帮助如何

<root>
    <xsl:for-each select="\\root\employee">
        <employee>
            <xsl:copy-of select="firstname"/>
            <xsl:copy-of select="lastname"/>
            <status>Single</status>
        </employee>
    </xsl:for-each>
</root>

单身
怎么样

<root>
    <xsl:for-each select="\\root\employee">
        <employee>
            <xsl:copy-of select="firstname"/>
            <xsl:copy-of select="lastname"/>
            <status>Single</status>
        </employee>
    </xsl:for-each>
</root>

单身

您可以使用linq to xml:

    var document = XDocument.Parse(xml);

    foreach (var element in document.Root.Elements("employee"))
    {
        element.Add(new XElement("status", "Single"));
    }

您可以使用linq转换为xml:

    var document = XDocument.Parse(xml);

    foreach (var element in document.Root.Elements("employee"))
    {
        element.Add(new XElement("status", "Single"));
    }
就我个人而言,我认为使用XSLT在这方面做得太过火了。我只想使用:

XDocument doc = XDocument.Load("http://localhost:4329/XsltTransform/nirav.xml");
foreach (var employee in doc.Descendants("employee"))
{
    employee.Add(new XElement("status", "Single"));
}
doc.Save(outputPath);
当然,如果您有其他使用XSLT的原因,那也没关系——只是不要认为这是在.NET中修改XML的唯一方法:)

我个人认为使用XSLT是过分的。我只想使用:

XDocument doc = XDocument.Load("http://localhost:4329/XsltTransform/nirav.xml");
foreach (var employee in doc.Descendants("employee"))
{
    employee.Add(new XElement("status", "Single"));
}
doc.Save(outputPath);

当然,如果您使用XSLT还有其他原因,那也没关系——只是不要认为这是在.NET中修改XML的唯一方法:)

XSLT有几个问题。首先,这个表达是不正确的

<xsl:value-of select="Single"/>

这将选择输入XML中不存在的元素Single的值。您实际上想要输出文字值'Single'

<xsl:value-of select="'Single'"/>

或者更确切地说,您可以“按原样”输出整个元素

<status>Single</status>
单一
其次,看起来您希望将状态添加为employee元素的最后一个元素。在这种情况下,您需要一个模板来匹配employee元素,该元素复制所有现有元素,然后只添加新的status元素

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

单身
这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>

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

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

单身
应用于XML时,将输出以下内容

<root>
   <employee>
      <firstname>Kaushal</firstname>
      <lastname>Parik</lastname>
      <status>Single</status>
   </employee>
   <employee>
      <firstname>Abhishek</firstname>
      <lastname>Swarnkar</lastname>
      <status>Single</status>
   </employee>
</root>

考沙尔
帕里克
单身
阿披实
斯旺卡
单身

(注意,我已经删除了对扩展函数的引用,因为我自己的电脑上没有这些函数)。

您的XSLT有几个问题。首先,这个表达是不正确的

<xsl:value-of select="Single"/>

这将选择输入XML中不存在的元素Single的值。您实际上想要输出文字值'Single'

<xsl:value-of select="'Single'"/>

或者更确切地说,您可以“按原样”输出整个元素

<status>Single</status>
单一
其次,看起来您希望将状态添加为employee元素的最后一个元素。在这种情况下,您需要一个模板来匹配employee元素,该元素复制所有现有元素,然后只添加新的status元素

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

单身
这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>

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

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

单身
应用于XML时,将输出以下内容

<root>
   <employee>
      <firstname>Kaushal</firstname>
      <lastname>Parik</lastname>
      <status>Single</status>
   </employee>
   <employee>
      <firstname>Abhishek</firstname>
      <lastname>Swarnkar</lastname>
      <status>Single</status>
   </employee>
</root>

考沙尔
帕里克
单身
阿披实
斯旺卡
单身

(注意,我已经删除了对扩展函数的引用,因为我自己的电脑上没有这些函数)。

您确定要为此使用XSLT吗?这看起来像是一个非常简单的转换,代码可以很容易地在代码中完成。你可以参考我的。@Nirav:是的,那更好-尽管我认为从你的所有答案中删除“请标记接受或+1,如果它对你有用…”是值得的。(这真的没有必要,而且看起来你只是非常需要代表…)@Nirav:谢谢你的帮助…@JonSkeet:我确实需要使用xslt。。。。这不是我的项目。。。。我只是给出了一个与我的项目类似的示例,以便清楚地了解我的代码应该如何工作。。。。无论如何,谢谢你……你真的想用XSLT来做这个吗?这看起来像是一个非常简单的转换,代码可以很容易地在代码中完成。你可以参考我的。@Nirav:是的,那更好-尽管我认为从你的所有答案中删除“请标记接受或+1,如果它对你有用…”是值得的。(这真的没有必要,而且看起来你只是非常需要代表…)@Nirav:谢谢你的帮助…@JonSkeet:我确实需要使用xslt。。。。这不是我的项目。。。。我只是给出了一个与我的项目类似的示例,以便清楚地了解我的代码应该如何工作。。。。无论如何,谢谢。。。。