2013-08-23 248 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