从{content:encoded>(xsl - RSS查看器WP)获取<img/> - SRC </content:encoded>

时间:2012-12-13 15:28:37

标签: image xslt rss cdata

我需要从这段代码中获取图像源:

<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=&quot;'), '&quot;&gt;')" />
 <img alt="" src="{$ImageURL}" width="75" height="49" />

不幸的是我的解决方案失败了我也尝试了一些其他语法,但主要部分是相同的。请问有人帮帮我吗?

感谢您的努力!

1 个答案:

答案 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=&quot;'), '&quot;')}" width="75" height="49"/>
  </xsl:template>
</xsl:stylesheet>