1

我刚开始学习 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>和标记都转换为XHTML 中的标记。但是,如果当我在内容中添加更多标签时(例如在本例中,通过“exp”和“pow”模板),它们会在添加时被删除(如在该行中,应该是)。<special><tt><sup><tt><tt>2·103</tt><tt>2·10<sup>3</sup></tt>

我究竟做错了什么?

4

1 回答 1

2

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

于 2012-07-19T18:27:45.797 回答