0

私は次のような入力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>

そして私は次のように出力xmlが必要です

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<root>
  <employee>
    <firstname>Kaushal</firstname>
    <lastname>Parik</lastname>
    <status>Single</status>
  </employee>
  <employee>
    <firstname>Abhishek</firstname>
    <lastname>Swarnkar</lastname>
    <status>Single</status>
  </employee>
</root>

「status」の値は、すべてのノードで「Single」です。この静的テキスト「Single」をc#コードで追加する方法はわかりますが、ノード「status」を追加する方法はわかりません。 "in xml through xslt ....試してみると、ノード" firstname "の下に追加され、示されているように予期された場所に追加されません。私が使用するコードは、

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<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"
            xmlns:myUtils="pda:MyUtils">
  <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/firstname">
    <xsl:element name="firstname">
      <xsl:value-of select="myUtils:FormatName(.)" />
    </xsl:element>
    <xsl:element name ="status">
      <xsl:value-of select ="Single"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.IO;

public partial class nirav : System.Web.UI.Page
{
    public class MyXslExtension
    {
        public string FormatName(string name)
        {
            return "Mr. " + name;
        }
        public int GetAge(string name)
        {
            int age = name.Count();
            return age;
        }
    }  
    protected void Page_Load(object sender, EventArgs e)
    {
        string outputpath = "nirav.xml";
        XsltArgumentList arguments = new XsltArgumentList();
        arguments.AddExtensionObject("pda:MyUtils", new MyXslExtension());
        using (StreamWriter writer = new StreamWriter(outputpath))
        {
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load("http://localhost:4329/XsltTransform/nirav.xslt");
            transform.Transform("http://localhost:4329/XsltTransform/nirav.xml", arguments, writer);
        }

    }
}

あなたの助けは大歓迎です....

4

4 に答える 4

2

個人的には、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を変更する唯一の方法だとは思わないでください:)

于 2012-08-03T07:38:59.367 に答える
2

XSLTにはいくつかの問題があります。まず、この式は正しくありません

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

これにより、入力XMLに存在しない要素Singleの値が選択されます。実際にリテラル値「シングル」を出力したい

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

むしろ、要素全体を「そのまま」出力することができます。

<status>Single</status>

次に、従業員要素の最後の要素としてステータスを追加したいようです。この場合、既存のすべての要素をコピーしてから、新しいステータス要素を追加するだけの、 employee要素と一致するテンプレートが必要です。

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

(拡張機能への参照は自分のPCにないため、削除しました)。

于 2012-08-03T07:42:13.193 に答える
1

linqtoxmlで実行できます。

    var document = XDocument.Parse(xml);

    foreach (var element in document.Root.Elements("employee"))
    {
        element.Add(new XElement("status", "Single"));
    }
于 2012-08-03T07:38:11.293 に答える
0

どうですか

<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>
于 2012-08-03T07:36:59.913 に答える