2010-04-08 41 views
0

標籤或元素的多個實例,我的RDF XML文件是這樣的..閱讀使用XSLT

<rdf:RDF> 
    <rdf:Description rdf:about="........"> 
     <j.0:property rdf:resource="....."/> 
     <j.0:property rdf:resource=....."/> 
     <j.0:property rdf:resource="........"/> 
    </rdf:Description> 
</rdf:RDF> 

現在在我的XSLT樣式表,我需要檢索所有j.0:property變量的值。我使用的是這樣的:

<xsl:apply-templates select="j.0:property"/> 

<xsl:template match="j.0:property"> 
     <xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert /@rdf:resource"/></xsl:text>  
</xsl:template> 

但是,然後它返回相同的值3次。該值是遇到的第一個屬性的值。 請幫助我如何獲得每個物業的價值。

+0

@shashank saket:選擇要使用的問題之一,並刪除其他。如果你不能放下,在另一個指向另一個問題的問題上添加一行作爲重複。這使得網站保持乾淨(你的雙重q:http://stackoverflow.com/questions/2597887/xslt-reading-multiple-instances-of-a-tag)。 – Abel 2010-04-08 08:29:17

回答

4

在模板匹配內部,您位於匹配元素的上下文中。因此,如果你想獲得一個屬性的值,所有你需要做的是:

<xsl:value-of select="@rdf:resource"/> 

你目前正在使用你選擇的屬性的路徑以「/」開頭,因此路徑開始文檔的根,而不是相對於你的位置。無論它在哪裏使用,它都會返回相同的值。

+0

謝謝你!!!!它的工作...真棒! – 2010-04-08 08:54:55

+0

這是指標記,其中問題確實不使用相對路徑,而是絕對路徑,導致第一個匹配被用於value-of。 – 2010-04-08 08:55:49

+0

請注意''xsl:value-of'不能用在'xsl:text'內,正如我在我的回答中所解釋的。該行顯示在q中。無法編譯。 – Abel 2010-04-08 09:02:29

0

此行是錯誤的:

<xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert /@rdf:resource"/></xsl:text> 

當你到你所選擇的項目是興田模板,所有你需要的是:

<xsl:value-of select="@rdf:resource" /> 
+0

這條線確實是錯的。但是解決方法(不幸的是):在'xsl:text'裏面,你不能有'xsl:value-of'語句(或者任何元素)。 – Abel 2010-04-08 08:38:47

+0

非常感謝你們! – 2010-04-08 08:55:30

+0

@Abel - Doh,一天過早,我的xslt生鏽了。現在修復。 – Murph 2010-04-08 10:05:55

1

它不能確定XSLT是否告訴你真的是你正在使用的XSLT。你發佈它的方式,它不能編譯。 xsl:apply-templates行與xsl:template行相同嗎? xsl:text是否真的含有xsl:value-of?如果是這樣,我會非常有興趣知道您使用的是哪個處理器,因爲沒有處理器應該在沒有通知您錯誤的情況下處理您的XSLT。

這就是說,要改進你的樣式表,在他的回答中做Russel Leggett explains。不要選擇模板中的所有節點(從/開始,從根中選擇),請從當前節點中選擇相對較多的節點。以他的回答和拆卸xsl:text錯誤,你會得到這樣的:

<xsl:template match="j.0:property"> 
    <xsl:value-of select="@rdf:resource"/> 
</xsl:template> 

使用XSLT 1.0,如果選擇多個節點與xsl:value-of它將輸出只有第一。因爲你看起來好像有一個xsl:apply-templates,在某個顯然可以工作的地方,那個選擇所有但只返回第一個(開頭的代碼)的行對於你的xsl:apply-templates中選擇的每個節點將被調用三次。

爲了幫助您進一步做到更好,請展示我們可以針對您的示例數據運行的完整XSLT樣式表的一個簡單示例。