2012-03-10 65 views
2

我有一個看起來像這樣的XML文件的內容找到一個節點:XSL:基於另一個節點

<container> 
<bugs> 
    <bug id="b1"> 
     <reporter>Tom</reporter> 
     ... 
    </bug> 
    <bug id="b2"> 
     <reporter>Jane</reporter> 
     ... 
    </bug> 
</bugs> 
<users> 
    <user> 
     <userid>10</userid> 
     <username>Tom</username> 
    </user> 
    <user> 
     <userid>5</userid> 
     <username>Jane</username> 
    </user> 
</users> 
</container> 

的endresult應該是:

<items> 
    <item> 
     <bugid>b1</bugid> 
     <author id="10">Tom</author> 
    </item> 
    <item> 
     <bugid>b2</bugid> 
     <author id="5">Jane</author> 
    </item> 
</items> 

問題:我不能爲id查找得到正確的比較。

我以爲這會是這樣:

<xsl:template match="bug"> 
.... 
    <xsl:element name="author"> 
     <xsl:attribute name="id"> 
      <xsl:value-of select="//users/user[username=reporter]/userid"/> 
     </xsl:attribute> 
    </xsl:element> 
.... 
</xsl:template> 

但這返回一個空ID(ID = 「」)。

<xsl:value-of select="//users/user[username='Tom']/userid"/> 

返回10個 和

<xsl:value-of select="reporter"/> 

回報湯姆。

我看不出這裏有什麼問題。

回答

2
//users/user[username=reporter]/userid 

查找包含等於usernamereporter元件user。它不會在您的bug中搜索reporter

你可以得到這個首先將記者的名字綁定到一個變量的工作:

<xsl:element name="author"> 
    <xsl:variable name="reporter" select="string(reporter)"/> 
    <xsl:attribute name="id"> 
    <xsl:value-of select="//users/user[username=$reporter]/userid"/> 
    </xsl:attribute> 
</xsl:element> 
+0

我最初嘗試了類似的方法,但錯過了字符串(...)。謝謝。它現在有效。 AND ....事實上,我在部分中出現了一些用戶,它們出現在部分。所以他們沒有返回ID是有效的。 :-(但是,我只注意到,因爲其他人現在產生了正確的結果。 – hepabolu 2012-03-11 11:13:23

0

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kUIdByName" match="userid" use="../username"/> 

<xsl:template match="bugs"> 
    <items> 
    <xsl:apply-templates/> 
    </items> 
</xsl:template> 

<xsl:template match="bug"> 
    <item> 
    <bugid><xsl:value-of select="@id"/></bugid> 
    <xsl:apply-templates/> 
    </item> 
</xsl:template> 

<xsl:template match="reporter"> 
    <author id="{key('kUIdByName',.)}"><xsl:value-of select="."/></author> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<container> 
    <bugs> 
     <bug id="b1"> 
      <reporter>Tom</reporter>  
     </bug> 
     <bug id="b2"> 
      <reporter>Jane</reporter>  
     </bug> 
    </bugs> 
    <users> 
     <user> 
      <userid>10</userid> 
      <username>Tom</username> 
     </user> 
     <user> 
      <userid>5</userid> 
      <username>Jane</username> 
     </user> 
    </users> 
</container> 

產生想要的,正確的結果

<items> 
    <item> 
     <bugid>b1</bugid> 
     <author id="10">Tom</author> 
    </item> 
    <item> 
     <bugid>b2</bugid> 
     <author id="5">Jane</author> 
    </item> 
</items> 

說明:用於查找適當利用keys

+0

以前從未使用鑰匙,但這對解釋如何解釋非常有幫助。 – hepabolu 2012-03-11 11:14:51

+0

我以爲我已經做到了,但它看起來像我可以只接受1個答案,因此在這裏寫作:我完全接受這個答案是非常有用的。 – hepabolu 2012-03-11 18:00:11