如何在 Oxygen XML 编辑器中使用 XSLT 2.0 将 XHTML 转换为 XML? XSLT 1.0 的解决方案不起作用
How to transform XHTML to XML with XSLT 2.0 in Oxygen XML editor? Solution for XSLT 1.0 doesn't work
我在使用 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>
我无法调用节点。我正在使用 oxygen 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 属性的值,例如这是带有更正样式表的简短结果示例:
<?xml version="1.0" encoding="UTF-8"?>
<section role="example" id="something_content">
(...)
</section>
再次感谢!!!
如果您使用名称空间,那么您必须始终如一地使用它们,因此 meta
到 select XHTML meta
元素的路径需要是 xhtml:meta
。
请注意,使用 XSLT 2 及更高版本后,您可以在 xsl:stylesheet
上使用 xpath-default-namespace="http://www.w3.org/1999/xhtml"
来简化您的操作,因为您可以使用例如match="html/head"
和 select="meta"
无需使用前缀。
我在使用 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>
我无法调用节点。我正在使用 oxygen 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 属性的值,例如这是带有更正样式表的简短结果示例:
<?xml version="1.0" encoding="UTF-8"?>
<section role="example" id="something_content">
(...)
</section>
再次感谢!!!
如果您使用名称空间,那么您必须始终如一地使用它们,因此 meta
到 select XHTML meta
元素的路径需要是 xhtml:meta
。
请注意,使用 XSLT 2 及更高版本后,您可以在 xsl:stylesheet
上使用 xpath-default-namespace="http://www.w3.org/1999/xhtml"
来简化您的操作,因为您可以使用例如match="html/head"
和 select="meta"
无需使用前缀。