我觉得你的理解不太对。依次查看 XSLT 中的模板,您从标准标识模板开始
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
这将简单地复制元素及其属性,然后继续处理其子元素。因此,如果您的 HTML 中有一个h1标签,它将按原样输出。
然后,您跟进元素的模板。
<xsl:template match="a"><xsl:apply-templates/></xsl:template>
因为这比身份模板更具体,所以它会优先考虑。在您的情况下,它不会复制a元素,但会处理其子元素。假设您的 a元素仅包含文本,则应根据需要输出。
您的最终模板与img元素匹配
<xsl:template match="img"/>
但这一切所做的只是完全无视它。
值得注意的是,XSLT 具有内置模板,当找不到匹配项时会使用这些模板。这些不会复制元素,但会继续处理其子元素。因此,如果您不想复制所有 HTML 元素,您可以只依赖内置模板,并且只为您希望对其执行特定操作的元素添加模板。
我不是 100% 确定您的要求,但如果您只是想获取一些 XHTML 并仅输出元素中的文本,您可以使用这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a/text()">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
因此,<xsl:template match="a/text()">
将输出a元素内的文本,而不太具体的<xsl:template match="text()">
将忽略所有其他文本。内置模板用于其他元素,如上所述,这不会输出它们,只是处理它的子元素(因此最终它将到达文本节点)。
所以,例如,如果你有这个 HTML
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
Welcome!
<img src="test.jpg" alt="Test Image" />
<p><a href="test.html">Test Link</a></p>
</body>
</html>
所有将输出的将是
Test Link