假设 Sharepoint WebPart 使用 XslCompiledTransform 并允许您将 XSLT 与嵌入式 C# 或 VB.NET 代码一起使用来实现扩展功能,以下应该会有所帮助:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
exclude-result-prefixes="msxsl mf content"
xmlns:mf="http://example.com/mf"
>
<msxsl:script implements-prefix="mf" language="C#">
<msxsl:using namespace="System.IO"/>
public XPathNavigator ParseFragment(string markupFragment)
{
using (StringReader sr = new StringReader(markupFragment))
{
using (XmlReader xr = XmlReader.Create(sr,
new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }))
{
XPathDocument doc = new XPathDocument(xr);
return doc.CreateNavigator();
}
}
}
</msxsl:script>
<xsl:output method="html"/>
<xsl:template match="content:encoded">
<xsl:apply-templates select="mf:ParseFragment(.)/span/img"/>
</xsl:template>
<xsl:template match="img">
<img alt="" src="{@src}" width="75" height="49" />
</xsl:template>
</xsl:stylesheet>
但是请注意,在 CDATA 部分中的标记上应用 XML 解析器需要它符合 XML 语法规则,因此解析 X(HT)ML 之类的东西
<content:encoded>
<![CDATA[
<span><img width="200" src="foo.png"/></span><br /> [some Text] ]]>
</content:encoded>
将工作,但解析 HTML 的东西,如
<content:encoded>
<![CDATA[
<span><img width="200" src="foo.png"></span><br> [some Text] ]]>
</content:encoded>
不管用。不幸的是,.NET 框架类库没有附带 HTML 解析 API,因此如果content:encoded
元素的内容是 HTML,您将需要寻找第三方 HTML 解析器,如 HTMLAgilityPack 来执行 XPathDocument 在我的示例中所做的工作,或者您真的XPath 1.0 对字符串解析的支持很差:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl content"
>
<xsl:template match="content:encoded">
<img alt="" src="{substring-before(substring-after(., 'src="'), '"')}" width="75" height="49"/>
</xsl:template>
</xsl:stylesheet>