在使用XSL将XHTML转换为XHTML时,我遇到了名称空间问题。考虑作为示例输入:
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Test</title></head>
<body>
<p>Remove this</p>
</body>
</html>
然后,以下转换不起作用(例如,不删除<p />
):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()" name="copy">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="p" />
</xsl:stylesheet>
但是这个确实:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:template match="@*|node()" name="copy">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="xhtml:p" />
</xsl:stylesheet>
我的问题和疑问是:如何更改XSLT,以便我不必为所有XHTML元素添加前缀,它仍然可以匹配它们?从我到目前为止尝试的内容来看,添加像<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" />
这样的默认命名空间并不能实现这一点。
感谢您的帮助!
答案 0 :(得分:1)
How can I change the XSLT so that I do not have to add prefixes to all the XHTML elements and it still get to match them?
这是可能的,但我会建议定义命名空间并使用preefix引用此命名空间中的元素:
<xsl:template match="*[local-name()='p']" />
警告强>:
只有在保证不存在两个具有相同local-name()
但在不同名称空间中的元素的情况下,此技术才是安全的。