2009-01-21 113 views
4

我試圖爲我的應用程序設計一個XML文檔結構。引用XML中的另一個元素

我想存儲孔的名單像下面

<Holes> 
<Hole id='1' dia='0.1' depth='2'/> 
<Hole id='2' dia='0.2' depth='1.67'/> 
<Hole id='3' dia='0.3' depth='0.44'/> 
</Holes> 

在我的文檔的另一部分我想引用其ID的洞。例如

<Drill useHoleWithId='1'/> 

當我的代碼查找上述<鑽>元件我希望它來檢索「直徑」和「深度」的值在具有ID =「1」的孔< >元素的屬性。

當然,我可以爲<孔>元素,ID爲「useHoleWithId」的值搜索,然後獲得屬性的值,但我想也許有更好的方法來做到這一點使用一些XML的把戲。在那兒?

PS - 雖然我對它們沒有任何意見,但可能是任何XPath,XLink,XQuery或XPointer都可以提供幫助。

回答

4

XPath肯定是一種方法。 XPath查詢ID爲1找到保持會像Holes/Hole[@id="1"]

0

你可以改造它:

<xsl:for-each select="my/Drill"> 
    <xsl:variable name="drillid"> 
    <xsl:value-of select="@useHoleWithId"/> 
    </xsl:variable> 
    <Drill> 
    <xsl:attribute name="diameter"> 
    <xsl:value-of select="/my/Holes/Hole[@id=$drillid]/@dia"/> 
    </xsl:attribute> 
    <xsl:attribute name="useid"> 
    <xsl:value-of select="$drillid"/> 
    </xsl:attribute> 
    </Drill> 
    </xsl:for-each> 

使Hole的屬性將出現在Drill標籤

1

XML是一種惰性查看數據。您已經使用用「useHoleWithId」創建了您的參考。如何解釋並採取行動,以獲得<hole>元素取決於您的實現,當然xpath(xslt更改文檔只是實現xpath來執行此操作)是實現此目的的有效方法。

3

有一個標準的XPath函數來引用元素的「id」屬性

XPath 1.0規格

id()函數函數選擇元件可以通過獨特ID(見[5.2.1唯一ID])。當參數id的類型爲node-set時,則結果爲應用id的結果與參數node-set中的每個節點的string-value的結果的並集。當id的參數是任何其他類型的參數時,該參數被轉換爲string,就好像通過調用string function; string分爲whitespace-separated list of tokenswhitespace是匹配生產S的任何字符序列);結果是node-set,其中包含document中的元素與context node中的元素的unique ID等於列表中的任何記號。

  • id("foo")選擇具有獨特ID FOO元素

  • id("foo")/child::para[position()=5]選擇
    元素的第五個para孩子具有獨特ID

另外,提到的更通用的方法到節點(不僅是元素)可能在​​<xsl:key/>指令和XSLT key()函數是專門爲此目的而設計的。

例如,假設文檔中包含的形式XSLT參考文獻,並且有包含書目數據庫與所述形式表項單獨的XML文檔bib.xml,即:

<entry name="XSLT">...</entry> 

然後樣式表可以使用以下方法來改造bibref元素

<xsl:key name="bib" match="entry" use="@name"/> 

<xsl:template match="bibref"> 
    <xsl:variable name="name" select="."/> 
    <xsl:for-each select="document('bib.xml')"> 
    <xsl:apply-templates select="key('bib',$name)"/> 
    </xsl:for-each> 
</xsl:template> 

待辦事項,在XSLT鍵克服id()函數的以下限制:

  • ID屬性必須被聲明爲在DTD 這樣。如果在外部DTD子集中聲明ID屬性 僅爲 ,那麼僅當XML處理器讀取外部DTD子集時,它纔會被識別爲ID屬性 。但是,XML 不需要XML處理器來讀取外部DTD的 ,並且他們可能會選擇不這樣做,尤其是 如果文檔被聲明爲 standalone="yes"

  • 一個文檔只能包含一個唯一的ID集合 。不能有獨立的 ID的獨立獨立組。

  • 元素的ID只能是在屬性中指定的 ;它不能由 元素的內容或由子元素指定 。

  • 一個ID被限制爲一個XML 名稱。例如,它不能包含 空格。

  • 元素最多隻能有一個ID。

  • 最多一個元素可以具有 特定ID。

由於這些限制,XML文檔有時會包含未由ID/IDREF/IDREFS屬性顯式聲明的交叉引用結構。

相關問題