将XML转换为XML的XSLT样式表(RSS 2.0)

时间:2011-02-11 02:18:29

标签: xslt rss2

这是我到目前为止所做的:

< ?xml version="1.0"?>  
< xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
< xsl:output method="RSS 2.0"/>  
< xsl:template match="Description">  
< title>  
< /title>  
< /xsl:template>  
< xsl:template match="Caption">  
< description> 
< /description> 
< /xsl:template> 
< xsl:template match="Url> 
< link>  
< /link>  
< /xsl:template>  
< xsl:template match="Condition">  
< g:condition>  
< /g:condition>  
< /xsl:template>  
< xsl:template match="Picture">  
< g:image_link>  
< /g:image_link>  
< /xsl:template>  
< /xsl:stylesheet>  

当我尝试在我只用几个项目创建的较小文件上使用它时,我得到这些调试错误:

/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
error parsing attribute name  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
attributes construct error  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
namespace   
error :   
Namespace prefix xmlns on g is not defined  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:4:   
parser   
error :   
Couldn't find end of Start Tag g line 4  
< xmlns:g="http://base.google.com/ns/1.0" version="1.0">  
        ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
Unescaped '<' not allowed in attributes values  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
attributes construct error  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:20:   
parser   
error :   
Couldn't find end of Start Tag template line 19  
< link>  
^  
/Users/subnetfile/Desktop/finalxsltemplate.xslt:22:   
parser   
error :   
Opening and ending tag mismatch: stylesheet line 2 and template  
< /xsl:template>  
               ^
/Users/subnetfile/Desktop/finalxsltemplate.xslt:24:   
parser   
error :   
Extra content at the end of the document  
< xsl:template match="Condition">  
^  
error  
xsltParseStylesheetFile : cannot parse /Users/subnetfile/Desktop/finalxsltemplate.xslt  
(null)  

我正确理解这一点,我只需要使用'匹配'功能,因为所有项目只有一个子级别的属性,没有属性值或类似的东西。
另外,最终产品中的字段需要在原始文件中具有相应的值,或者可以为每个项目插入它们。例如,最终格式需要一个名为“payment_accepted”的字段,并且没有相应的字段,但我只想为每个项目添加相同的值,例如“Visa”。我会用“foreach”之类的东西代替“匹配”吗?

编辑:

< xsl:stylesheet  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
     xmlns:g="http://base.google.com/ns/1.0"  
    version="1.0">  

  < xsl:output method="RSS 2.0"/>  
  < xsl:template match="*[local-name()='title']">  
    < xsl:text>title: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="*[local-name()='link']">  
    < xsl:text>link: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="*[local-name()='description']">  
    < xsl:text>description: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  


  < xsl:template match="language"/>  < !-- suppress -->  

< /xsl:stylesheet>  

这已经开始做点什么,但我需要另一个线索

编辑:
我已经取得了一些进展并做了一些正确的事情:

< xsl:stylesheet  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
     xmlns:g="http://base.google.com/ns/1.0"  
    version="1.0">  

  < xsl:output method="text"/>  

  < xsl:template match="Description">  
    < xsl:text>title: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="Url">  
    < xsl:text>link: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  

  < xsl:template match="Caption">  
    < xsl:text>description: </xsl:text>  
    < xsl:apply-templates/>  
  < /xsl:template>  


  < xsl:template match="language"/>  < !-- suppress -->  

< /xsl:stylesheet>  

这没有调试错误,它不是我需要的,我将如何添加使用xlmnsg..etc的google命名空间属性和一些在xml文件中没有相应值的属性,就像我只是想要的为每个节点分配相同的g:condition'new'(我是否正确地将每个元素称为节点?)

1 个答案:

答案 0 :(得分:1)

您在“XSLT样式表”中提供的文本中有许多正式错误:

  • 任何开始标记的左尖括号都不会立即跟随名称。

  • 它不是格式良好的XML:

<xmlns:g="http://base.google.com/ns/1.0"
     

版本= “1.0” &GT;

这里有两个错误

  • 不允许使用名称xmlns:g,因为名称空间前缀不能以保留字“xml”开头。

  • 一个elemnt名称后面跟不是非空格字符(在这种情况下是=)。

这看起来像一个名称空间声明,不应该被编码为看起来像元素的东西。

<xsl:template match="Url>
<link>
</link>
</xsl:template>
<xsl:template match="Condition">

缺少必须包含match属性值的第二个引号,因此第一行的第一个引号和最后一行的第一个引号之间的所有内容都被视为属性值...

即使纠正了所有这些错误并且样式表现在如下所示:

<xsl:stylesheet
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:g="http://base.google.com/ns/1.0"
    version="1.0">

  <xsl:output method="RSS 2.0"/>
  <xsl:template match="Description">
      <title>    </title>
  </xsl:template>
  <xsl:template match="Caption">
      <description>    </description>
  </xsl:template>
  <xsl:template match="Url">
      <link>    </link>
  </xsl:template>
  <xsl:template match="Condition">
      <g:condition>    </g:condition>
  </xsl:template>
  <xsl:template match="Picture">
      <g:image_link>    </g:image_link>
  </xsl:template>
</xsl:stylesheet>

这段代码毫无意义。它并不真正处理源XML文件,也不会在结果输出中带来任何内容。

我的建议是阅读至少一个轻量级的XSLT教程,并且只有在您对开始编写代码有一些基本的了解时才能阅读。