咨询:使用XSLT通过XPath提取HTML元素innerHTML的方法
问题:用XSLT提取元素完整innerHTML而非仅文本内容
我想要基于一份现有HTML文档生成新的HTML文档,选择使用XSLT作为模板语言。但当我使用<xsl:value-of>标签通过XPath提取源文档元素时,仅能获取文本内容,而我希望获取元素的完整innerHTML。
以下是我正在使用的XSL文件:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" xpath-default-namespace="http://www.w3.org/1999/xhtml" > <xsl:template match="/"> <xsl:value-of select="//article" /> </xsl:template> </xsl:stylesheet>
请问我应该用哪个标签替代<xsl:value-of>?是否还存在其他遗漏的设置?
解决方案
用<xsl:copy-of>替代<xsl:value-of>即可,前者会复制选中节点的完整节点树(包括子元素、属性和文本内容),而后者仅提取节点的文本值。
修改后的XSL代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" xpath-default-namespace="http://www.w3.org/1999/xhtml" > <xsl:template match="/"> <!-- 只复制article的内部内容(innerHTML) --> <xsl:copy-of select="//article/node()" /> </xsl:template> </xsl:stylesheet>
补充说明:
- 如果你需要连
<article>元素本身一起复制,把select的值改成//article即可;如果只需要内部内容,用//article/node()选中所有子节点。 - 你当前的命名空间配置没问题:
xpath-default-namespace指定了XHTML默认命名空间,能正确匹配源文档里的<article>元素,不需要额外调整。
内容的提问来源于stack exchange,提问作者Dj0ulo
相关产品推荐
相关产品推荐

