2

好的,我正在从这里完成一些简单的教程:

http://www.cch.kcl.ac.uk/legacy/teaching/7aavdh06/xslt/html/module_06.html

第一个练习涉及创建一个产生特定输出的转换。不幸的是,虽然我很接近,但我在一开始就得到了一个不需要的元素。IE

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0">

  <xsl:output method="xhtml"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />

  <xsl:template match="/div/placeName">
    <html>
      <head />
      <body>
        <Table>
          <tr>
            <td>Place Name</td>
            <td>
              <xsl:value-of select="name" />
            </td>
          </tr>
          <tr>
            <td>Place Name (regularised)</td>
            <td>
              <xsl:value-of select="@reg" />
            </td>
          </tr>
          <tr>
            <td>National Grid Reference</td>
            <td>
              <xsl:value-of select="@key" />
            </td>
          </tr>
          <tr>
            <td>Type of building/monument</td>
            <td>
              <xsl:value-of select="settlement/@type" />
            </td>
          </tr>
        </Table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

但我得到的输出是:

Location
Place Name  Old Warden
Place Name (regularised)    Old Warden, St Leonard
National Grid Reference TL 137 443
Type of building/monument   Parish church

其余的都很好,但“位置”是不需要的。源 XML 在上面的链接中。知道如何阻止不需要的文本出现吗?或者,更好的是,告诉我哪里出错了!:)

编辑:这是输出

<?xml version="1.0" encoding="utf-8" ?>
Location
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<body>
    <table>
        <tr>
            <td>Place Name</td>
            <td>Old Warden</td>
        </tr>
        <tr>
            <td>Place Name (regularised)</td>
            <td>Old Warden,  St Leonard</td>
        </tr>
        <tr>
            <td>National Grid Reference</td>
            <td>TL 137 443</td>
        </tr>
        <tr>
            <td>Type of building/monument</td>
            <td>Parish church</td>
        </tr>
    </table>
</body>
</html>
4

3 回答 3

2

正如 Stivel 提到的,“位置”文本确实来自 XML 中的head元素。

<div type="location">
    <head n="I">Location</head>
    <placeName reg="Old Warden,  St Leonard" key="TL 137 443">

它出现的原因是 XSTL 的内置模板,当您没有为它在 XSLT 中寻找的元素指定匹配项时,它会使用该模板。

您可以在W3C 页面上阅读内置模板,但简而言之,如果 XSLT 找不到匹配项,它将继续处理元素的子元素(不复制元素),或者在文本或属性的情况下,输出价值。

XSLT 将首先查找文档元素的匹配项,如果您没有提供模板,它将继续查找根元素的模板,然后是其子元素,依此类推。

在您的情况下,直到/div/placeName之前您还没有提供模板来匹配任何内容,这意味着 XSLT 将为div元素使用内置模板。这有两个孩子;地名。您有一个模板可以用于placeName,但不能用于head,因此内置模板最终会输出head的文本,因为您没有告诉它任何其他内容。

解决方案是简单地添加一个模板来忽略头部元素

<xsl:template match="/div/head" />

这是完整的 XSLT

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

  <xsl:output method="xhtml"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes" />

  <xsl:template match="/div/head" />

  <xsl:template match="/div/placeName">
    <html>
      <head />
      <body>
        <Table>
          <tr>
            <td>Place Name</td>
            <td>
              <xsl:value-of select="name" />
            </td>
          </tr>
          <tr>
            <td>Place Name (regularised)</td>
            <td>
              <xsl:value-of select="@reg" />
            </td>
          </tr>
          <tr>
            <td>National Grid Reference</td>
            <td>
              <xsl:value-of select="@key" />
            </td>
          </tr>
          <tr>
            <td>Type of building/monument</td>
            <td>
              <xsl:value-of select="settlement/@type" />
            </td>
          </tr>
        </Table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

当您使用它时,这应该会提供您需要的输出。

于 2012-10-29T14:08:51.713 回答
0

可能你<head/>可以参考

<head n="I">Location</head>

在 xsl中删除<head/>并检查。

于 2012-10-29T13:46:13.563 回答
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xhtml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="div">
<xsl:apply-templates select="placeName"/>
</xsl:template>
  <xsl:template match="placeName">
    <html>
      <head />
      <body>
        <Table>
          <tr>
            <td>Place Name</td>
            <td>
              <xsl:value-of select="name" />
            </td>
          </tr>
          <tr>
            <td>Place Name (regularised)</td>
            <td>
              <xsl:value-of select="@reg" />
            </td>
          </tr>
          <tr>
            <td>National Grid Reference</td>
            <td>
              <xsl:value-of select="@key" />
            </td>
          </tr>
          <tr>
            <td>Type of building/monument</td>
            <td>
              <xsl:value-of select="settlement/@type" />
            </td>
          </tr>
        </Table>
      </body>
    </html>
  </xsl:template>
于 2012-10-29T14:05:41.863 回答