使用 xslt 2.0样式表时,我无法将XHMTL文件转换为XML。我知道XSLT 1.0已回答了这个问题,但它确实不适用于XSLT 2.0!
示例XHTML文件:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="de" xml:lang="de" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="something" content="content"/>
(...)
</head>
<body onload="...">
(...)
</body>
</html>
示例样式表:
<?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">
<xsl:template match="xhtml:html/xhtml:head">
<section role="example">
<xsl:attribute name="id" select="concat('something', meta[@name='something']/@content)"/>
(...)
</section>
</xsl:stylesheet>
我无法调用节点。我正在使用氧气XML编辑器(遗憾的是旧版本,但对于所有XML转换,它工作得很好)我尝试了不同的处理器(Saxon-EE 9.4.0.6,Saxon HE 9.4.0.6,Saxon-PE9.4.0.6。)。我查看了这个问题XHTML to XML XSLT conversion which makes reference to XSLT 2.0,并尝试用星号替换匹配中的命名空间,但编辑器不接受它。
在@MartinHonnen的宝贵评论之后,我将XSLT更改为:
<?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" exclude-result-prefixes="xhtml">
<xsl:template match="xhtml:html/xhtml:head">
<section role="example">
<xsl:attribute name="id" select="concat('something', xhtml:meta[@name='something']/@content)"/>
(...)
</section>
</xsl:stylesheet>
这个小小的改变奏效了。现在可以从XHTML中提取各种元信息。使用生成的XML中的前样式表,只有“something_”作为id-attribute的值填充,例如这是修正后的样式表的简短结果示例:
<?xml version="1.0" encoding="UTF-8"?>
<section role="example" id="something_content">
(...)
</section>
再次感谢!!!!
答案 0 :(得分:1)
如果使用命名空间,则必须始终如一地使用它们,因此选择XHTML meta
元素的路径meta
必须为xhtml:meta
。
请注意,使用XSLT 2及更高版本,您可以使用xpath-default-namespace="http://www.w3.org/1999/xhtml"
上的xsl:stylesheet
更轻松,因为您可以使用例如match="html/head"
和select="meta"
,无需使用前缀。