我需要从这段代码中获取图像源:
<content:encoded>
<![CDATA[
<span><img width="200" src="..."></span><br /> [some Text] ]]>
</content:encoded>
这就是我的尝试:
<xsl:variable name="ImageURL" select="substring-before(substring-after(content, 'src="'), '">')" />
<img alt="" src="{$ImageURL}" width="75" height="49" />
不幸的是我的解决方案失败了我也尝试了一些其他语法,但主要部分是相同的。请问有人帮帮我吗?
感谢您的努力!
答案 0 :(得分:0)
假设Sharepoint WebPart使用XslCompiledTransform并允许您使用带有嵌入式C#或VB.NET代码的XSLT来实现扩展功能,以下内容应该有所帮助:
<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,你需要寻找像HTMLAgilityPack这样的第三方HTML解析器来执行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>