2013-08-23 200 views
2

好的我正在尝试使用XSLT将XHTML文档转换为RDF/XML(不要求,这是一个分配),其中RDF文件的信息位于XHTML中的元标记中文件。我已经完成了我的第一个XPath查询,以查找<rdf:Description>about属性的值。我在一个单独的网站上测试了XPath查询,并返回了正确的结果。但是,当我尝试将它合并到我的XSLT中时,结果是一个空字符串。XSL返回值不匹配

我只是在正确的方向寻找一个微调。我没有看到我错在哪里。以下是示例XHTML文档。

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<?xml-stylesheet href="TN6_Q6.xsl" type="text/xsl" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" /> 
    <meta name="DC.title" content="le titre de mon document" /> 
    ... 
    <title>...</title> 
    </head> 
    <body> 
    ... 
    </body> 
</html> 

这就是我到目前为止建立的XSLT。我知道这看起来很糟糕,但再次......这是这项任务。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<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="*"> 
<html><body><pre> 
&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt; 
&lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" &gt; 
&lt;rdf:Description rdf:about=" 

    <!-- THIS LINE --> 
    <xsl:value-of select="html/*[local-name()='head']/*[local-name()='link']/@href"/>"&gt; 

&lt;/rdf:Description&gt; 
&lt;/rdf:RDF&gt; 
</pre></body></html> 
</xsl:template> 
</xsl:stylesheet> 

您可以测试的XPath就在这里: http://www.xpathtester.com/saved/85785aab-0449-472e-a94f-77ee49d4e330

回答

1

你的模板匹配"*"所以当value-of评估将是根html的元素的上下文节点。因此,你只需要从head启动路径:

<xsl:value-of select="*[local-name()='head']/*[local-name()='link']/@href"/> 

或大于local-name()招更好的办法是使用的事实,你已经声明了命名空间的<xsl:stylesheet>和路径使用相应的限定名称:

<xsl:value-of select="xhtml:head/xhtml:link/@href" /> 

您也可以考虑更改模板是match="/"而不是match="*",在这种情况下,背景是文档根节点而非html元素,所以你需要添加html前面的路径:

<xsl:value-of select="xhtml:html/xhtml:head/xhtml:link/@href" /> 
+0

你说得对最后一部分。我试图对它过于通用,但我实际上可以假定提供的文档将是XHTML。我无法做到这一点,但我会测试更多的东西。 – ApplePie

+0

是的!最后的编辑做到了。将“*”更改为“/”是解决方案!非常感谢。启用时,我会在5分钟内接受。 – ApplePie