我正在尝试将来自RSS提要的XML转换为IBM Cognos应用程序可以理解的另一种XML形式。我对此非常陌生,我只是在尝试IBM提供的示例。以下是提供的.xsl文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:message>Start: Fields to Consider in the transformation</xsl:message>
<xsl:element name="dataset">
<xsl:element name="metadata">
<xsl:element name="item">
<xsl:attribute name="name">title</xsl:attribute>
<xsl:attribute name="type">xs:string</xsl:attribute>
<xsl:attribute name="length">256</xsl:attribute>
</xsl:element>
<xsl:element name="item">
<xsl:attribute name="name">link</xsl:attribute>
<xsl:attribute name="type">xs:string</xsl:attribute>
<xsl:attribute name="length">256</xsl:attribute>
</xsl:element>
<xsl:element name="item">
<xsl:attribute name="name">description</xsl:attribute>
<xsl:attribute name="type">xs:string</xsl:attribute>
<xsl:attribute name="length">256</xsl:attribute>
</xsl:element>
</xsl:element>
<xsl:apply-templates/>
</xsl:element>
<xsl:message>End: Fields to Consider in the transformation</xsl:message>
</xsl:template>
<xsl:template match="channel">
<xsl:element name="data">
<xsl:apply-templates select="item"/>
</xsl:element>
</xsl:template>
<xsl:template match="item">
<xsl:if test='starts-with(./link, "http://rss.msn.com/en-us/money?feedoutput=rss")'>
<xsl:element name="row">
<xsl:element name="value"><xsl:value-of select="./title"/></xsl:element>
<xsl:element name="value"><xsl:value-of select="./link"/></xsl:element>
<xsl:element name="value"><xsl:value-of select="./description"/></xsl:element>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:transform>
当我尝试上面的代码时,返回的结果集没有任何数据,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
- <dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/">
- <metadata>
<item name="title" type="xs:string" length="256" />
<item name="link" type="xs:string" length="256" />
<item name="description" type="xs:string" length="256" />
</metadata>
<data />
</dataset>
最终结果应该看起来像这样,但我得到的结果如上所述没有任何数据。请有人让我知道我做错了什么:
<?xml version="1.0" encoding="UTF-8"?>
<dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<metadata>
<item name="Title" type="xs:string" length="256"/>
<item name="Link" type="xs:string" length="256"/>
<item name="Description" type="xs:string" length="256"/>
</metadata>
<data>
<row>
<value>test1</value>
<value>test2</value>
<value>test3</value>
</row>
<row>
<value>test4</value>
<value>test5</value>
<value>test6</value>
</row>
</data>
</dataset>
答案 0 :(得分:0)
检查&lt; link&gt;输入中的元素。如果网址不是以“http://rss.msn.com/en-us/money?feedoutput=rss”开头,则输出中不会包含任何内容。
答案 1 :(得分:0)
我猜你要改变:
<xsl:if test='starts-with(./link, "http://rss.msn.com/en-us/money?feedoutput=rss")'>
为:
<xsl:if test='starts-with(./link,"http://www.msn.com/en-us/money/")'>
顺便说一句,您可以使用文字结果元素并将xsl:if
指令更改为谓词来显着简化样式表:
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://developer.cognos.com/schemas/xmldata/1/" >
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<dataset>
<metadata>
<item name="title" type="xs:string" length="256"/>
<item name="link" type="xs:string" length="256"/>
<item name="description" type="xs:string" length="256"/>
</metadata>
<xsl:apply-templates/>
</dataset>
</xsl:template>
<xsl:template match="channel">
<data>
<xsl:apply-templates select="item[starts-with(./link,'http://www.msn.com/en-us/money/')]"/>
</data>
</xsl:template>
<xsl:template match="item">
<row>
<value>
<xsl:value-of select="title"/>
</value>
<value>
<xsl:value-of select="link"/>
</value>
<value>
<xsl:value-of select="description"/>
</value>
</row>
</xsl:template>
</xsl:transform>