【问题标题】:Get <img>-SRC out of <content:encoded> (xsl - RSS Viewer WP)从 <content:encoded> 中获取 <img>-SRC (xsl - RSS Viewer WP)
【发布时间】:2012-12-13 15:28:37
【问题描述】:

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

<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" />

很遗憾,我的解决方案失败了。我还尝试了其他一些语法,但主要部分是相同的。有人可以帮帮我吗?

感谢所有的努力!

【问题讨论】:

  • 您到底使用哪个 XSLT 处理器?如果可能,应该使用扩展函数将content:encoded元素的内容解析为XML片段,然后简单地使用片段上的XPath来访问img元素的src属性。 span 元素。
  • 抱歉,我不是 XSLT 专业人士。那么您需要什么信息(XSLT 处理器?)?我已经尝试使用 ":encoded" 但如果我使用它会出现错误。我必须如何使用 XPath?
  • 如何在 XSL Styleshhet 中使用 XPath?我查了一下,但我不知道如何正确使用它:-/
  • 我想知道您用来执行 XSLT 代码的软件的名称。常见的 XSLT 1.0 处理器有 Apache Xalan(存在于 Java 和 C++ 中)、Saxon 6、LibXslt/XsltProc、XslCompiledTransform、MSXML 等等。至于我的建议,现在不用担心,首先尝试找出您使用的 XSLT 处理器,然后我们可以进一步提供帮助。您可以通过您的 XSLT 处理器运行 home.arcor.de/martin.honnen/xslt/processorTest.xml 以输出有关它的一些详细信息。
  • 好问题...它是嵌入在 Sharepoint 2010 中的 WebPArt。我认为它是 XslCompiledTransform。很遗憾,我无法在 Sharepoint 中使用您的测试。

标签: image xslt rss cdata


【解决方案1】:

假设 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,您将需要寻找第三方 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=&quot;'), '&quot;')}" width="75" height="49"/>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2012-04-22
  • 1970-01-01
  • 2016-04-09
  • 2016-12-05
相关资源
最近更新 更多