2009-01-21 90 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属性显式声明的交叉引用结构。