在同一文件上应用两个xslt转换

时间:2014-12-08 12:51:58

标签: xml xslt rdf

我有这个RSS我想用XSLT进行转换:

<?xml version="1.0" encoding="utf-8" ?>
<rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://www.example1.com">
    <title>atitle</title>
    <link>alink</link>
  </channel>

  <item rdf:about="http://www.example2.com">
    <title>atitle2</title>
    <link>alink2</link>
  </item>

  <item rdf:about="http://www.example3.com">
    <title>atitle3</title>
    <link>alink3</link>
  </item>

  <!--There's more to the file-->

</rdf>

我不得不使用这种转变

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@* | node()" />
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

清除文件的属性,使其看起来像这样

<?xml version="1.0" encoding="utf-8" ?>
<rdf>

  <channel>http://www.example1.com
    <title>atitle</title>
    <link>alink</link>
  </channel>

  <item>http://www.example2.com
    <title>atitle2</title>
    <link>alink2</link>
  </item>

  <item>http://www.example2.com
    <title>atitle3</title>
    <link>alink3</link>
  </item>

  <!--There's more to the file-->

</rdf>

我的主要目标是简单地列出这样的项目:

<items>
  <item title="atitle2" link="alink2">
  <item title="atitle3" link="alink3">
</items>

我是否必须进行第二次转型?

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/rdf">
    <items>
      <xsl:for-each select="/item">
        <item>
          <xsl:attribute name="title">
            <xsl:value-of select="title"/>
          </xsl:attribute>
          <xsl:attribute name="link">
            <xsl:value-of select="link"/>
          </xsl:attribute>
        </item>
      </xsl:for-each>
    </items>
  </xsl:template>
</xsl:stylesheet>

或者有没有办法同时应用两个转换?或者我必须单独申请?或者可能比我正在尝试的方式更简单?

1 个答案:

答案 0 :(得分:2)

这个样式表怎么样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://purl.org/rss/1.0/" exclude-result-prefixes="ns">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <items>
        <xsl:apply-templates select="//ns:item"/>
    </items>
</xsl:template>
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="*" mode="child"/>
    </xsl:element>
</xsl:template>
<xsl:template match="*" mode="child">
    <xsl:attribute name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>
</xsl:stylesheet>