Update xml file by calling a C# function in xslt

后端 未结 2 661
挽巷
挽巷 2021-01-16 16:21

I have a xml file and an xslt file in my website project.

xml file:


  
    Kaushal
           


        
相关标签:
2条回答
  • 2021-01-16 16:45

    You could consider using the XmlDocument class here;

    For example, you actually have the XML you want in the stream output from your XslTransform:

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

    EDIT. You'll also need to change your XSLT for this to work. Something like:

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

    Should work. However, this is probably not the best approach as you need to supply an age per person and you don't seem to be sourcing this from anywhere. I'd recommend the DOM approach.

    You also have to be careful here, though; it's conceivable that there might be a read lock on the file if it's being read by another process. If this is a one off exercise I'd consider just doing this prior to deploying your website.

    Another alternative is to not use XSLT. In this instance you could also consider simple DOM processing:

    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();
    

    I haven't compile checked this code but hopefully the intent is clear. Note that you could also use XDocument if you preferred.

    0 讨论(0)
  • 2021-01-16 16:47

    Please refer answer of this question for first step of question.

    For next step of answer, use following 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>  
    

    And add following function in MyXslExtension class:

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

    You will get the output like this:

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

    Hope this will help you....

    0 讨论(0)
提交回复
热议问题