【问题标题】:How to transform XHTML to XML with XSLT 2.0 in Oxygen XML editor? Solution for XSLT 1.0 doesn't work如何在 Oxygen XML 编辑器中使用 XSLT 2.0 将 XHTML 转换为 XML? XSLT 1.0 的解决方案不起作用
【发布时间】:2018-05-11 21:10:59
【问题描述】:

我在使用 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这个issue,也试过用星号替换匹配中的namespace,但是编辑不接受。

在@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>

再次感谢!!!!

【问题讨论】:

  • “我无法调用节点”究竟是什么意思?发布您想要的结果和 oXygen 给您的结果,或任何确切的错误消息。一般来说,如果您使用命名空间,那么您需要始终如一地使用它们,因此 meta 路径也应该是 xhtml:meta
  • 感谢您的评论@MartinHonnen。我将 meta 更改为 xhtml:meta 并且它起作用了。我从另一个问题中了解到,我只能在匹配属性值中添加它。这实际上已经回答了我的问题。我可以以某种方式为你投票吗?我将在问题描述中添加 XSTL 中的更正和更正结果示例。
  • 我已经添加了上一条评论的建议作为答案以及一个建议,以简化使用 XSLT 2 或更高版本在命名空间中匹配和选择元素的任务,这样您就可以将问题标记为解决了。​​

标签: xml xslt-2.0 xhtml-transitional


【解决方案1】:

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

请注意,使用 XSLT 2 及更高版本,您可以在 xsl:stylesheet 上使用 xpath-default-namespace="http://www.w3.org/1999/xhtml" 使您的喜欢更容易,因为您可以使用例如match="html/head"select="meta" 无需使用前缀。

【讨论】:

  • 太棒了!感谢您对进一步提示的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 2011-12-16
  • 1970-01-01
  • 2012-05-31
  • 2016-08-24
相关资源
最近更新 更多