XSLT + C#:由于 XmlDocument 的格式良好限制,Return 没有周围帮助器 <root> 元素的平面节点集?
XSLT + C#: Return flat set of nodes without surrounding helper <root> element because of XmlDocument's well-formedness restriction?
我的 XSLT 样式表中有这样一个 C# 函数:
<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>
把“1960”变成<year>1960</year>
,把“4.7.2016”变成<year>2016</year><month>07</month><day>04</day>
等等
为了将元素 year
、month
和 day
flat 添加到我的输出 XML...
<someOtherStuff>...</someOtherStuff>
<year>2016</year>
<month>07</month>
<day>04</day>
<moreStuff>...</moreStuff>
...我必须使用这样的函数:
<xsl:copy-of select="utils:dateSplit(myInput)/root/*"/>
我无法避免dateSplit()
函数中的辅助<root>
元素,因为XmlDocument
必须是良构的(顶层只有一个元素)。无法将多个元素附加到根。
是否有替代方案,例如 ResultTreeFragment,它不能确保格式正确以避免人为和临时的 <root>
元素?
如果您使用 CreateDocumentFragement 创建一个 XmlDocumentFragment
,那么您可以将您的元素添加到该片段并 return 它而不是 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)"/>
我的 XSLT 样式表中有这样一个 C# 函数:
<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>
把“1960”变成<year>1960</year>
,把“4.7.2016”变成<year>2016</year><month>07</month><day>04</day>
等等
为了将元素 year
、month
和 day
flat 添加到我的输出 XML...
<someOtherStuff>...</someOtherStuff>
<year>2016</year>
<month>07</month>
<day>04</day>
<moreStuff>...</moreStuff>
...我必须使用这样的函数:
<xsl:copy-of select="utils:dateSplit(myInput)/root/*"/>
我无法避免dateSplit()
函数中的辅助<root>
元素,因为XmlDocument
必须是良构的(顶层只有一个元素)。无法将多个元素附加到根。
是否有替代方案,例如 ResultTreeFragment,它不能确保格式正确以避免人为和临时的 <root>
元素?
如果您使用 CreateDocumentFragement 创建一个 XmlDocumentFragment
,那么您可以将您的元素添加到该片段并 return 它而不是 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)"/>