XSLT:如何从源中丢弃不需要的HTML节点?

时间:2015-08-18 19:32:23

标签: xslt xml-parsing xslt-1.0

我正在使用XSLT 1.0,并在OS X Yosemite上使用xsltproc。 源内容是HTML;目标内容是XML。

这个问题很常见。我希望所有人都感兴趣并且#34; 节点只是从输出中丢弃。我见过全能 像这样的指令:

<xsl:template match="node()|script"/>

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

这接近我的需要。但不幸的是,当我需要添加另一个访问node()捕获的文本节点之一的模板时,它太强大了。例如,假设我添加了此模板:

<xsl:template match="a/div[@class='location']/br">
  <xsl:text> </xsl:text>
</xsl:template>

简单地取代某些&lt; br /&gt;带空格的元素。 好吧,node()阻止后一个模板生效, 因为包含换行符的相关文本节点被丢弃 已经!

好吧,为了纠正这个问题,我所做的就是取代全面node()

<xsl:template match="html/head|div[@id='banner_parent']|button|ul|div[@id='feed_title']|span|div[@class='submit_event']|script"/>

但这正是问题所在:我现在拼凑一个模板 当来源时,其匹配标准可能容易出错 内容变化。

是否有更简单的指令可以完成同样的事情?我瞄准的是这样的事情:

<xsl:template match="node()[not(locations)]|script"/>

感谢。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你只需要输出中的一些节点,其余的你不在乎,在这个例子中我尝试只捕捉li元素并将其余部分抛弃..不确定这是否是你想要的http://xsltransform.net/gWmuiKk

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<!-- Lets pretend li is interesting for you -->
<xsl:template match="li">
<xsl:text>Interesting Node Only!
</xsl:text>
</xsl:template>

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