2016-06-08 3 views
0

나는 내 XSLT 스타일 시트에서이 같은 C#을 기능이 있습니다XSLT + C# : XmlDocument의 형식이 제한되어 있기 때문에 보조 도우미없이 노드의 플랫 세트를 <root> 요소로 반환 하시겠습니까?

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

그것은 <year>1960</year>에 "1960"전환 "2016년 4월 7일을"등 <year>2016</year><month>07</month><day>04</day>

에 요소를 year 추가하려면, month 내 출력 XML에 평면day ...

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

은 ... 나는를 사용해야합니다 이런 기능 :

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

XmlDocument은 (상위 레벨에서 단지 하나의 요소)를 잘 형성되어야하기 때문에 I에서, dateSplit() 함수 보조 <root> 요소를 피할 수 없다. 루트에 여러 요소를 추가 할 수는 없습니다.

인공 및 임시 <root> 요소를 방지하기 위해 정형식을 보장하지 않는 ResultTreeFragment 같은 다른, 뭔가가 있나요?

답변

1

당신은 CreateDocumentFragementXmlDocumentFragment 다음 그 조각에 요소를 추가하고 대신을 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; 

그리고 그것을 사용 :

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

감사에 대한 올바른 방향으로 포인터, 그것은 내 문제를 해결! 조각을 사용하여 편집 된 코드를 포함하기 위해 답을 편집하기 위해 제출했습니다. – CoDEmanX

관련 문제