65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.77/5 (9投票s)

2006年5月18日

CPOL

2分钟阅读

viewsIcon

50413

downloadIcon

342

这是一种描述如何使用 C# 在 XSLT 中创建节点树片段的技术。 此外,本文还描述了如何在 XSLT 中使用 C#。

Before transformation

图像 A - 转换前

After Transformation

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

© . All rights reserved.