从XSL for-each中的不同命名空间中选择节点

时间:2012-10-30 11:51:38

标签: xslt

我已经成功地使用新闻源了很长一段时间了。 然而,本周我遇到了一个问题:我的RSS Feed中的一个节点有一个自定义命名空间。 无论我尝试什么,都不会返回具有自定义命名空间的节点。

示例Feed:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:mailplus="http://api.mailplus.nl/rss/mailplus/">
   <channel>
       <item>
           <title>test</title>
           <link>www.google.com</link>
           <description>This is a test</description>
           <mailplus:image>
              <![CDATA[http://www.test.nl/Portals/0/Images/Nieuws/ADO FC Groningen vierkant 2.jpg]]>
           </mailplus:image>
      </item>
  </channel>
</rss>

我的XSL文件示例:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mailplus="http://api.mailplus.nl/rss/mailplus/">
 <xsl:output method="html" indent="yes"/>
 <xsl:param name="ItemsToShow"/>
 <xsl:param name="ShowItemDetails"/>
 <xsl:param name="ShowItemDate"/>
 <xsl:param name="Locale"/>
 <xsl:param name="Target"/>
 <xsl:template match="rss">
 <ul class="RSS">

 <xsl:for-each select="channel/item">
  <xsl:sort select="position()" data-type="number" order="descending" />
  <xsl:if test="position()&lt;=$ItemsToShow or $ItemsToShow&lt;1">
  <li>
    <h3>
     <xsl:attribute name="target"><xsl:value-of select="$Target"/></xsl:attribute>
     <xsl:value-of select="title"/>
    </h3>
    <xsl:value-of select="./*[namespace-uri()='http://api.mailplus.nl/rss/mailplus/']" disable-output-escaping="yes"/>
   </li>
   </xsl:if>
  </xsl:for-each>
  </ul>
 </xsl:template>
</xsl:stylesheet>

预期结果:

Test
<![CDATA[http://www.test.nl/Portals/0/Images/Nieuws/ADO FC Groningen vierkant 2.jpg]]>

实际结果:

Test

我测试了多个不同的select语句,例如:

select="mailplus:image"

select="./mailplus:*"

select="./*[local-name()='image']"

select="./*[namespace-uri()='http://api.mailplus.nl/rss/mailplus/']"

select="./*[local-name()='image' and namespace-uri()='http://api.mailplus.nl/rss/mailplus/']"

但是,这些都不会返回任何内容。

我已经能够在http://www.xpathtester.com/test的在线解析器中成功测试这些select语句。在使用在线解析器时,我必须将select查询中的“./”更改为“//”,因为在这种情况下我没有使用for-each循环。

任何人都可以确认我是在正确的轨道上,还是指出我做错了什么?

提前感谢您的建议。 Hanneke

0 个答案:

没有答案