使用XSLT在html中选择特定标签,并将标签的内容打印到XML

时间:2012-10-31 08:08:15

标签: xml xslt html-parsing

对于上一篇文章感到抱歉。

现在我会更加清楚。

我需要从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页面/ doc中选择<a><img>标签并在标签内打印内容(告诉我,如果我对此的理解是错误的)。但是上面的XSLT输出了整个页面的html。任何人都可以指出哪里可能出错,以及需要采取哪些措施才能使其正确。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你的理解并不完全正确。依次查看XSLT中的模板,您可以从标准身份模板

开始
<xsl:template match="node()|@*">
   <xsl:copy>
     <xsl:apply-templates select="node()|@*"/>
   </xsl:copy>
</xsl:template>

这将简单地复制元素及其属性,然后继续处理其子元素。因此,如果HTML中包含 h1 标记,则会按原样输出。

然后,您可以使用 a 元素的模板进行操作。

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

因为这比身份模板更具体,所以它将优先考虑。在您的情况下,它不会复制 a 元素,但会处理其子元素。假设您的 a 元素只包含文本,则应根据需要输出。

您的最终模板与 img 元素匹配

<xsl:template match="img"/>

但所有这一切都完全忽略了它。

值得注意的是,XSLT具有内置模板,当它找不到匹配项时会使用它。这些不会复制元素,但会继续处理其子元素。因此,如果您不想复制所有HTML元素,则可以依赖内置模板,并仅为希望采取特定操作的元素添加模板。

我不是百分之百确定您的要求,但如果您只想采用一些XHTML并仅输出 a 元素中的文本,则可以使用此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