重用xslt模板以格式化xml元素

时间:2011-09-14 12:20:26

标签: xml xslt

我有一个xml文件

<catalog>
  <s1>
    <cd>
      <title>TRACK A</title>
      <artist>ARTIST A</artist>
    </cd>
  </s1>
  <s2>
    <cd>
      <title>TRACK B</title>
      <artist>TRACK B</artist>
    </cd>
  </s2>
  <s3>
    <cd>
      <title>TRACK C</title>
      <artist>ARTIST C</artist>
    </cd>
    <cd>
      <title>TRACK D</title>
      <artist>ARTIST D</artist>
    </cd>
  </s3>
</catalog>

我正在尝试设置模板来格式化s1和s3的元素,但是以不同方式格式化s2的元素。

我有的xslt是

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

  <xsl:for-each select="catalog/s1">
    <xsl:call-template name="style1"/> 
  </xsl:for-each>

  <xsl:for-each select="catalog/s2">
    <xsl:call-template name="style2"/>    
  </xsl:for-each>

  <xsl:for-each select="catalog/s3">
    <xsl:call-template name="style1"/> 
  </xsl:for-each>

</xsl:template>

<xsl:template match="cd" name="style1">
  <b><xsl:value-of select="title" /></b>
  <b><xsl:value-of select="artist" /></b>
</xsl:template>

<xsl:template match="cd" name="style2">
  <i><xsl:value-of select="title" /></i>
</xsl:template>

</xsl:stylesheet>

但它没有产生任何输出。我认为我需要,但这样做似乎无论如何称为“风格1”。

为什么这不会产生输出?

谢谢

赖安

1 个答案:

答案 0 :(得分:2)

在您的select语句中输入“ cd / ”:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

  <xsl:for-each select="catalog/s1">
    <xsl:call-template name="style1"/> 
  </xsl:for-each>

  <xsl:for-each select="catalog/s2">
    <xsl:call-template name="style2"/>    
  </xsl:for-each>

  <xsl:for-each select="catalog/s3">
    <xsl:call-template name="style1"/> 
  </xsl:for-each>

</xsl:template>

<xsl:template match="cd" name="style1">
  <b><xsl:value-of select="cd/title" /></b>
  <b><xsl:value-of select="cd/artist" /></b>
</xsl:template>

<xsl:template match="cd" name="style2">
  <i><xsl:value-of select="cd/title" /></i>
</xsl:template>

</xsl:stylesheet>