0

对上一篇文章感到抱歉。

现在我会尝试更清楚。

我需要从 html 中选择几个标签,并且我有以下 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="node()|@*">
 <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="a"><xsl:apply-templates/></xsl:template>
<xsl:template match="img"/>
</xsl:stylesheet>

根据我的理解,这是从 html 页面/文档中选择<a><img>标记并打印标签内的内容(如果我的理解是错误的,请告诉我)。但是上面的 XSLT 输出页面的整个 html。谁能指出我哪里出了问题以及需要做些什么才能使它正确。

谢谢你。

4

1 回答 1

1

我觉得你的理解不太对。依次查看 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
于 2012-10-31T08:59:05.307 回答