【问题标题】:Select specific tags in html using XSLT and print the contents of the tags to XML使用 XSLT 选择 html 中的特定标签并将标签的内容打印到 XML
【发布时间】:2012-10-20 15:44:04
【问题描述】:

对上一篇文章感到抱歉。

现在我会尝试更清楚。

我需要从 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 中选择 &lt;a&gt;&lt;img&gt; 标签并打印标签内的内容(如果我的理解是错误的,请告诉我)。但是上面的 XSLT 输出页面的整个 html。谁能指出我哪里出了问题以及需要做些什么才能使它正确。

谢谢。

【问题讨论】:

  • 您不能对 HTML 使用 XSLT,除非它是一种非常特殊的 HTML 形式,称为 XHTML。如果不是,没有 XML 解析器将处理它。您可以研究 JSoup,它可以从 HTML 生成 XML DOM。

标签: xml xslt html-parsing


【解决方案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 元素,您可以只依赖内置模板,并且只为您希望对其执行特定操作的元素添加模板。

我不能 100% 确定您的要求,但如果您只是想获取一些 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>

因此,&lt;xsl:template match="a/text()"&gt; 将输出 a 元素内的文本,而不太具体的 &lt;xsl:template match="text()"&gt; 将忽略所有其他文本。内置模板用于其他元素,如前所述,这不会输出它们,只是处理其子元素(因此最终它将到达文本节点)。

例如,如果你有这个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2023-03-16
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多