0

在使用xslt 2.0 stylesheet时,我无法将 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 到 XML XSLT 转换,它引用了 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>

再次感谢!!!!

4

1 回答 1

1

如果您使用名称空间,那么您必须始终如一地使用它们,因此meta选择 XHTMLmeta元素的路径必须是xhtml:meta.

xpath-default-namespace="http://www.w3.org/1999/xhtml"请注意,使用 XSLT 2 及更高版本,您可以在 as 上更轻松地使用 like xsl:stylesheet,然后您可以使用 eg match="html/head"select="meta"而无需使用前缀。

于 2017-11-28T12:37:23.140 回答