2016-06-08 17 views
0

Ich habe eine C# Funktion wie diese in meinem Stylesheet:XSLT + C#: Zurückgeben einer flachen Menge von Knoten ohne umgebenden Helfer <root> Element wegen XmlDocuments wohlgeformter Einschränkung?

<xsl:stylesheet ... 
    xmlns:utils="urn:local"> 

<msxsl:script language="CSharp" implements-prefix="utils"> 
    <![CDATA[ 
    public XmlDocument dateSplit(string str) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlElement root = doc.CreateElement(string.Empty, "root", string.Empty); 

     Regex rgx = new Regex("(?:(\\d{1,2})\\.(\\d{1,2})\\.)?(\\d{4})?"); 
     Match match = rgx.Match(str); 

     XmlElement yearElem = doc.CreateElement(string.Empty, "year", string.Empty); 
     XmlElement monthElem = doc.CreateElement(string.Empty, "month", string.Empty); 
     XmlElement dayElem = doc.CreateElement(string.Empty, "day", string.Empty); 

     if (match.Success) { 

     string dayVal = match.Groups[1].Value; 
     string monthVal = match.Groups[2].Value; 
     string yearVal = match.Groups[3].Value; 

     if (dayVal != "" && monthVal != "" && yearVal != "") { 

      XmlText dayText = doc.CreateTextNode(dayVal.PadLeft(2, '0')); 
      XmlText monthText = doc.CreateTextNode(monthVal.PadLeft(2, '0')); 
      XmlText yearText = doc.CreateTextNode(yearVal); 

      dayElem.AppendChild(dayText); 
      monthElem.AppendChild(monthText); 
      yearElem.AppendChild(yearText); 

     } else if (yearVal != "") { 

      XmlText yearText = doc.CreateTextNode(yearVal); 
      yearElem.AppendChild(yearText); 

     } 
     } 
     root.AppendChild(yearElem); 
     root.AppendChild(monthElem); 
     root.AppendChild(dayElem); 

     doc.AppendChild(root); 
     return doc; 
    } 
    ]]> 
    </msxsl:script> 

It "1960" in <year>1960</year> "2016.04.07" in <year>2016</year><month>07</month><day>04</day> usw.

Um verwandelt sich die Elemente year hinzufügen möchten, month und dayflach in meine XML-Ausgabe ...

<someOtherStuff>...</someOtherStuff> 
<year>2016</year> 
<month>07</month> 
<day>04</day> 
<moreStuff>...</moreStuff> 

... ich habe das verwenden, Funktion wie folgt:

<xsl:copy-of select="utils:dateSplit(myInput)/root/*"/> 

I die Hilfs <root> Elemente in der dateSplit() Funktion nicht vermeiden kann, weil XmlDocument wohlgeformt (nur auf der obersten Ebene ein einzelnes Element) sein. Es ist nicht möglich, mehrere Elemente an den Stamm anzuhängen.

Gibt es eine Alternative, so etwas wie ein ResultTreeFragment, die nicht Wohlgeformtheits-, um das künstliche und temporäres <root> Element zu vermeiden, ist sicherzustellen?

Antwort

1

Wenn Sie erstellen ein XmlDocumentFragment mit CreateDocumentFragement dann können Sie Ihre Elemente zu diesem Fragment hinzufügen und senden Sie es an Stelle des XmlDocument:

<msxsl:script language="CSharp" implements-prefix="utils"> 
    <![CDATA[ 
    public XmlDocumentFragment dateSplit(string str) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlDocumentFragment docFrag = doc.CreateDocumentFragment(); 

     // ... 

     docFrag.AppendChild(yearElem); 
     docFrag.AppendChild(monthElem); 
     docFrag.AppendChild(dayElem); 

     return docFrag; 

Und dann ist es wie folgt verwenden:

<xsl:copy-of select="utils:dateSplit(myInput)"/> 
+0

Vielen Dank für der Zeiger in die richtige Richtung, löste es mein Problem! Ich habe Ihre Antwort bearbeitet, um meinen bearbeiteten Code mithilfe des Fragments hinzuzufügen. – CoDEmanX