使用 Internet Explorer 在 XSLT 中创建节点树片段






3.77/5 (9投票s)
这是一种描述如何使用 C# 在 XSLT 中创建节点树片段的技术。 此外,本文还描述了如何在 XSLT 中使用 C#。
图像 A - 转换前
图像 B - 转换后
引言
本文描述了一种使用 C# 在 XSLT 中创建节点树片段的方法。
概述
这个概念源于通过设置给定元素的内部文本部分,以编程方式将格式良好的 XML 嵌入到现有的 XML 对象中。 我可以使用 XML DOM 附加子节点技术,但为了本例的目的,我选择不使用。 当你这样做时,嵌入的格式良好的 XML 被视为字符串,而不是 XML 节点。 图像 A 以黑色显示嵌入的 XML。 您无法展开或折叠任何嵌入的 XML 节点。 我发现的几个解决方案要求我使用 Microsoft 提供的 XML 解析器以外的其他 XML 解析器 - 我想到了 Xerces。 事实上,Microsoft XML 解析器不包含将字符串转换为节点树片段的本机函数。
那么,你如何访问这些值或元素呢? 需要将 XML 字符串转换为节点树片段。
问题:我需要在 XML 中嵌入 XML。 之后,执行从一种 XML 格式到另一种 XML 格式的转换。 在 XML 中嵌入 XML 是一种不被各种 XML 专家推荐的做法。 但是,当情况无法修改以致于无法采用最佳实践方法时,就无能为力了。 使用 .NET Framework 进入 IE XML/XSLT 节点树片段创建!
使用代码
真正的技巧是使用适当的命名空间设置 XSLT 文件
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:cs="urn:the-xml-files:xslt-csharp"
exclude-result-prefixes="cs ms">
一旦设置了命名空间声明,添加任意数量的 .NET Framework 感知类就相对容易了。 我使用 XPathNodeIterator
函数将格式良好的 XML 字符串转换为节点树片段。
<ms:script language="C#" implements-prefix="cs">
<![CDATA[
XPathNodeIterator parse(String strXML)
{
System.IO.StringReader rdr = new System.IO.StringReader(strXML);
XPathDocument doc = new XPathDocument(rdr);
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr;
expr = nav.Compile("/");
XPathNodeIterator iterator = nav.Select(expr);
return iterator;
}
]]>
</ms:script>
这是一个示例 XML 片段。 注意 <system_codes>
元素。 其中,我以编程方式嵌入了一个格式良好的 XML 字符串。 当 MS XML 解析器解释它时,所有的小于号和大于号字符都会被转义。 MS XML 解析器将以编程方式为您转义 XML,因为它被视为文本/字符串。 我可以使用 AppendChild
方法来合并 XML,但那样就没有必要写这篇文章了!
<request>
<tkrnum>300005</tkrnum>
<zertnum>20010003</zertnum>
<username>DIRENZO</username>
<result>implemented</result>
<system_codes>Embedded Well-Formed XML is here - download
article source to see it</system_codes>
</system_codes>
</request>
这是访问 Parse
函数并描述迭代过程的 XSL 代码片段
<xsl:variable name="syscodes" select="cs:parse(system_codes)"/>
<internal_sys_codes>
<!-- Iterate here-->
<xsl:for-each select="$syscodes//trresult" >
<sys_code>
<icode><xsl:value-of select="srdcode"/></icode>
<icomment><xsl:value-of select="comment"/></icomment>
</sys_code>
</xsl:for-each>
</internal_sys_codes>
请注意 cs:
前缀,它引用 XSLT 标头中包含的命名空间。 我将 cs:parse
的结果放入 syscodes
中。 然后,发生包含在 syscodes
中的新节点树片段的迭代。 通过此迭代,我可以使用最初嵌入的 XML 字符串(现在是节点树片段)中包含的值并重塑 XML。
关注点
这项技术的真正关键在于,除非我们进行服务器端转换,否则无法执行。 转换必须使用 .NET Framework 完成,否则将抛出无效的类字符串异常。 仅在 XML 文件中引用 XSL 文件将不起作用。 有关转换结果,请参见图像 B。