XSLT 转换
XLST conversion
我正在尝试将来自 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>
检查输入中的 元素。如果 url 不是以“http://rss.msn.com/en-us/money?feedoutput=rss”开头,您将不会在输出中获得任何内容。
我猜你想改变:
<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>
我正在尝试将来自 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>
检查输入中的 元素。如果 url 不是以“http://rss.msn.com/en-us/money?feedoutput=rss”开头,您将不会在输出中获得任何内容。
我猜你想改变:
<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>