2008-09-15 9 views
8

鑑於以下XML:匹配有條件的是當前節點值

<current> 
    <login_name>jd</login_name> 
</current> 
<people> 
    <person> 
    <first>John</first> 
    <last>Doe</last> 
    <login_name>jd</login_name> 
    </preson> 
    <person> 
    <first>Pierre</first> 
    <last>Spring</last> 
    <login_name>ps</login_name> 
    </preson> 
</people> 

我怎樣才能獲得「李四」從目前的/登錄匹配之內?

我試過如下:

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../people/first[login_name = .]"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../people/last[login_name = .]"/> 
</xsl:template> 

回答

10

我會定義一個關鍵指標的人:

<xsl:key name="people" match="person" use="login_name" /> 

這裏使用按鍵只需保持代碼簡潔,但你可能還會發現它的效率,如果你經常有來獲取有用<person>基於他們的<login_name>孩子的元素。

我有一個返回給定<person>的格式名稱的模板:

<xsl:template match="person" mode="name"> 
    <xsl:value-of select="concat(first, ' ', last)" /> 
</xsl:template> 

然後我會怎麼做:

<xsl:template match="current/login_name"> 
    <xsl:apply-templates select="key('people', .)" mode="name" /> 
</xsl:template> 
+0

好吧,我再回答下面的答案,這個很棒。清潔並由漂亮的可重複使用的部件組成。 – 2008-09-15 12:59:51

+0

我喜歡它!謝謝......從來沒有聽說過xsl:key之前...... – 2008-10-02 11:35:45

0

我覺得他其實是想在比賽中更換爲「當前」節點,不匹配的人節點:

<xsl:variable name="login" select="//current/login_name/text()"/> 

<xsl:template match="current/login_name"> 
<xsl:value-of select='concat(../../people/person[login_name=$login]/first," ", ../../people/person[login_name=$login]/last)'/> 

</xsl:template> 
4

你想current()功能

<xsl:template match="current/login_name"> 
    <xsl:value-of select="../../people/person[login_name = current()]/first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="../../people/person[login_name = current()]/last"/> 
</xsl:template> 

或者多一點清潔劑:

<xsl:template match="current/login_name"> 
    <xsl:for-each select="../../people/person[login_name = current()]"> 
    <xsl:value-of select="first"/> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="last"/> 
    </xsl:for-each> 
</xsl:template> 
+0

Thx的當前尖端更好的解決方案可以給予結束...甚至如果我真的不喜歡在xslt中使用for-each ... – 2008-09-15 12:06:12

0

只是爲了我的想法添加到堆棧

<xsl:template match="login_name[parent::current]"> 
<xsl:variable name="login" select="text()"/> 
<xsl:value-of select='concat(ancestor::people/child::person[login_name=$login]/child::first/text()," ",ancestor::people/child::person[login_name=$login]/child::last/text())'/> 
</xsl:template> 

我總是喜歡用軸明確在我的XPath,更詳細更清晰,但恕我直言。

根據其他XML文檔的外觀(假設這只是一個片段),您可能需要約束對「ancestor :: people」的引用,例如使用「ancestor :: people [1]」來約束到第一個人的祖先。

1

如果您需要訪問多個用戶,然後JeniT's <xsl:key /> approach是理想的。

這裏是我的另類對其採取:

<xsl:template match="current/login_name"> 
    <xsl:variable name="person" select="//people/person[login_name = .]" /> 
    <xsl:value-of select="concat($person/first, ' ', $person/last)" /> 
</xsl:template> 

我們所選擇的<person>節點分配給一個變量,然後我們使用concat()功能輸出第一/姓氏。

您的示例XML中也存在錯誤。所述<person>節點不正確地</preson>(錯字)

如果我們知道XML文檔的整體結構(有根節點等)

相關問題