XLST转换

时间:2016-06-21 20:28:35

标签: xml xslt xsd xml-parsing

我正在尝试将来自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> 

2 个答案:

答案 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>