对于上一篇文章感到抱歉。
现在我会更加清楚。
我需要从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。任何人都可以指出哪里可能出错,以及需要采取哪些措施才能使其正确。
谢谢。
答案 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