我有这样的事情:
<body>
foo bar foo bar foo bar...
<p>foo bar!</p>
<div class="iWantYourContent">
<p>baz</p>
</div>
</body>
我想要这个输出:
<body>
foo bar foo bar foo bar...
<p>foo bar!</p>
<p>baz</p>
</body>
我已设法使用此功能获取节点的内容:
<xsl:template match="/">
<xsl:apply-templates select="//x:div[@class = 'iWantYourContent']"/>
</xsl:template>
<xsl:template match="//x:div[@class = 'iWantYourContent']">
<body>
<xsl:copy-of select="node()"/>
</body>
</xsl:template>
但是我无法保留文件的其余部分。
感谢您的帮助。
答案 0 :(得分:4)
执行此类操作的方法通常是使用身份模板复制所有内容:
<xsl:template match="node()|@*" >
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
然后你制作一个模板来匹配你想要跳过的项目:
<xsl:template match="div[@class='iWantYourContent']" >
<xsl:apply-templates select="*" />
</xsl:template>
即。跳过副本,因为您不希望div元素复制,但DO应用模板 在其他元素上,因为你确实想要复制div的后代。
(如果你想完全跳过内容,那么你会把模板留空,根本没有内容输出。)
答案 1 :(得分:0)
如果您只对纯文本和<p>
节点感兴趣,请使用:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Suppress the xml header in output -->
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<body><xsl:apply-templates /></body>
</xsl:template>
<xsl:template match="p">
<p><xsl:copy-of select="text()"/></p>
</xsl:template>
</xsl:stylesheet>
我使用命令行工具xsltproc
来测试样式表:
xsltproc test.xsl test.html
输出:
<body>
foo bar foo bar foo bar...
<p>foo bar!</p>
<p>baz</p>
</body>