0

Web サイト プロジェクトに xml ファイルと xslt ファイルがあります。

xml ファイル:

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

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:Concat="urn:XslSample">
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="root">
      <xsl:for-each select="employee">
        <![CDATA[Concatenated name is ]]>
            <xsl:value-of select="Concat:GetFullName(firstname,lastname)"/>
            <xsl:value-of select="age"/>
        <br />
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

aspx.cs:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Xml;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            MemoryStream objStream = new MemoryStream();
            StreamWriter objWriter = new StreamWriter(objStream, System.Text.Encoding.UTF8);

            XPathDocument doc = new XPathDocument(Server.MapPath("XMLFile.xml"));
            XslCompiledTransform trans = new XslCompiledTransform();
            trans.Load(Server.MapPath("XSLTFile.xslt"));

            //create the XslArgumentList and new BookUtils object
            XsltArgumentList argList = new XsltArgumentList();

            Concat objUtil = new Concat();

            //this tells the argumentlist about BookUtils
            argList.AddExtensionObject("urn:XslSample", objUtil);

            //new XPathNavigator
            XPathNavigator nav = doc.CreateNavigator();

            //do the transform
            trans.Transform(nav, argList, objWriter);
            //objWriter.Flush();
            objStream.Position = 0;
            StreamReader oReader = new StreamReader(objStream);
            string strResult = oReader.ReadToEnd();
            //objWriter.Close();
            //oReader.Close();
            Response.Write(strResult);
        }
        catch (Exception Ex)
        { Response.Write(Ex.Message); }
    }
}

public class Concat
{
    public Concat()
    { }

    public string GetFullName(string firstname, string lastname)
    { return "Mr." + firstname; }
}

サイトを実行するときは、xslt から ac# 関数を呼び出して、xml ファイルの値を変更する必要があります..ac# コードを使用して、すべての名の前にテキスト ("Mr." など) を追加しています... . 追加後、出力を応答として書き込みますが、元の xml は変更されません。それをxmlファイルに反映させたいのですが……。

xml 出力が必要です:

<root>
  <employee>
    <firstname>Mr.Kaushal</firstname>
    <lastname>Parik</lastname>
  </employee>
  <employee>
    <firstname>Mr.Abhishek</firstname>
    <lastname>Swarnkar</lastname>
  </employee>
</root>

また、次のステップとして、別の c# 関数を使用して xml ファイル (age など) に別のノードを追加する必要があります..c# 関数は xslt ファイルから呼び出す必要があることに注意してください.... 誰でも助けてくれますか?これのための簡単なコードで????

最終的な xml が必要です:

<root>
  <employee>
    <firstname>Mr.Kaushal</firstname>
    <lastname>Parik</lastname>
    <age>34</age>
  </employee>
  <employee>
    <firstname>Mr.Abhishek</firstname>
    <lastname>Swarnkar</lastname>
    <age>30</age>
  </employee>
</root>
4

2 に答える 2

1

ここで XmlDocument クラスの使用を検討できます。

たとえば、実際には、XslTransform からのストリーム出力に必要な XML があります。

XmlDocument resultDocument = new XmlDocument();
resultDocument.Load(objStream);
resultDocument.Save(Server.MapPath("XMLFile.xml"));

編集。これを機能させるには、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:Concat="urn:XslSample">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
        <root>
            <xsl:apply-templates select="/root/employee" />
        </root>

  </xsl:template>

    <xsl:template match="employee">
        <employee>
            <firstname>Mr. <xsl:value-of select="./firstname"/></firstname>
            <lastname><xsl:value-of select="./lastname"/></lastname>
            <age>24</age>
        </employee>
    </xsl:template>

</xsl:stylesheet>

動作するはずです。ただし、1 人あたりの年齢を指定する必要があり、これをどこからも調達していないように見えるため、これはおそらく最良のアプローチではありません。DOM アプローチをお勧めします。

ただし、ここでも注意が必要です。ファイルが別のプロセスによって読み取られている場合、ファイルに読み取りロックがかかっている可能性があります。これが 1 回限りの演習である場合は、Web サイトを展開する前にこれを行うことを検討します。

もう 1 つの方法は、XSLT を使用しないことです。この例では、単純な DOM 処理も検討できます。

XmlDocument doc = new XmlDocument();
doc.Load(Server.MapPath("XMLFile.xml"));

XmlNodeList employeeNodes = doc.SelectNodes("//employee");

foreach(XmlNode employeeNode in employeeNodes)
{
    employeeNode.SelectSingleNode("./firstname").InnerText = String.Format("Mr. {0}", employeeNode.SelectSingleNode("./firstname").InnerText);
    XmlNode ageNode = doc.CreateElement("age");
    ageNode.InnerText = "3 Billion Years";
    employeeNode.ChildNodes.Add(ageNode0;
}

doc.Save();

このコードをコンパイルしてチェックしていませんが、意図が明確であることを願っています。必要に応じて、 XDocumentを使用することもできます。

于 2012-08-02T09:46:10.187 に答える
0

質問の最初のステップについて は、この質問の回答を参照してください。

回答の次のステップでは、次の xsl を使用します。

<?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:variable name="vQ">Mr. </xsl:variable>
<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="Age">
  <xsl:value-of select="myUtils:AddAge()" />
</xsl:element>
</xsl:template>

<xsl:template match="employee/firstname">
<xsl:element name="firstname">
  <xsl:value-of select="myUtils:FormatName(.)" />
</xsl:element>
</xsl:template>

<xsl:template match="employee">
<xsl:element  name="employee">
  <xsl:apply-templates select="@* | *"/>
  <xsl:element name="Age">
    <xsl:value-of select="myUtils:AddAge()" />
  </xsl:element>
</xsl:element>
</xsl:template>

</xsl:stylesheet>  

MyXslExtension クラスに次の関数を追加します。

public string AddAge()
    {
        return "25";
    }  

次のような出力が得られます。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<root>
<employee>
<firstname>Mr. Kaushal</firstname>
<lastname>Parik</lastname>
<Age>25</Age>
</employee>
<employee>
<firstname>Mr. bhishek</firstname>
<lastname>Swarnkar</lastname>
<Age>25</Age>
</employee>
</root>  

これがあなたを助けることを願っています....

于 2012-08-02T11:52:53.250 に答える