在XSLT模板中传递标记

时间:2012-07-19 17:54:23

标签: xslt xhtml

我刚开始学习XSLT,一切正常,直到我试图集中格式化。

这是我的问题:

XML

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<document>

<code>code</code>

<code>2<exp>3</exp></code>

<text>
This is a <special>special</special> word. 2<exp>3</exp>
</text>

</document>

XSLT

<?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" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" doctype-public="-//W3C//DTD XHTML 1.1//EN" encoding="utf-8"/>

<xsl:template name="times">·</xsl:template>

<xsl:template name="pow">
  <xsl:param name="exponent"/>
  <xsl:element name="sup"><xsl:value-of select="$exponent"/></xsl:element>
</xsl:template>

<xsl:template match="exp">
  <xsl:call-template name="times"/>
  <xsl:text>10</xsl:text>
  <xsl:call-template name="pow">
    <xsl:with-param name="exponent"><xsl:apply-templates/></xsl:with-param>
  </xsl:call-template>
</xsl:template>

<xsl:template name="codeword">
  <xsl:param name="word"/>
  <xsl:element name="tt">
    <xsl:value-of select="$word"/>
  </xsl:element>
</xsl:template>

<xsl:template match="special">
  <xsl:call-template name="codeword">
    <xsl:with-param name="word"><xsl:apply-templates/></xsl:with-param>
  </xsl:call-template>
</xsl:template>

<xsl:template match="document">
  <xsl:element name="html">
    <xsl:attribute name="xmlns">http://www.w3.org/1999/xhtml</xsl:attribute>
    <xsl:element name="head">
      <xsl:element name="title"><xsl:text>Title</xsl:text></xsl:element>
    </xsl:element>
    <xsl:element name="body">

      <xsl:apply-templates select="code"/>

      <xsl:apply-templates select="text"/>

    </xsl:element>
  </xsl:element>
</xsl:template>

<xsl:template match="code">
  <xsl:element name="div">
    <xsl:text>(</xsl:text>
    <xsl:call-template name="codeword">
      <xsl:with-param name="word"><xsl:apply-templates/></xsl:with-param>
    </xsl:call-template>
    <xsl:text>)</xsl:text>
  </xsl:element>
</xsl:template>

<xsl:template match="text">
  <xsl:element name="p">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

XHTML (使用xsltproc)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Title</title>
  </head>
  <body>
    <div>(<tt>code</tt>)</div>
    <div>(<tt>2·103</tt>)</div>
    <p>
This is a <tt>special</tt> word. 2·10<sup>3</sup>
</p>
  </body>
</html>

所以,我正在尝试将源XML中的<code><special>标记转换为XHTML中的<tt>。但是,如果我在内容中添加更多标记(例如<sup>,通过“exp”和“pow”模板),则会在添加<tt>时删除它们(如<tt>2·103</tt>中所示1}}行,应为<tt>2·10<sup>3</sup></tt>)。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

像往常一样,在我提出问题之后不久就找到了答案(我在寻找答案之前花了一些时间)。答案是here,使用参数时我必须使用copy-of而不是value-of