在数组中的不同对象中查找 XPath 的值

Find value of XPath in different object in array

我目前正在 XSL-FO 中构建文档,以基于项目列表构建 table。问题是项目之间存在关系,我需要能够根据关系引用其他项目的值。

假设我有一个像这样的输入对象:

    <Products>
      <Product>
        <ID>A</ID>
        <Name>Cat</Name>
        <Relationship>
          <ID>B</ID>
        </Relationship>
      </Product>
      <Product>
        <ID>B</ID>
        <Name>Hat</Name>
      </Product>
    </Products>

我需要能够将 table 的格式组合在一起:

    Name
    ----
    Cat
     - Hat
    ----
    Hat

要构建 table 行,我已经完成了

    <fo:table>
      <xsl:apply-templates select='Product' />
    </fo:table>

然后 'within' 每个产品,根据名称放置一个块:

    <fo:block>
      <xsl:value-of select="Name" />
    </fo:block>
    <fo:block>
      <xsl:apply-template select="..." />
    </fo:block>

我的问题是获取名称的 ... select 选项。我希望能够按照 ../Product[ID=./Relationship/ID]/Name 的方式构建一个 xpath 但它不起作用,因为 ./ 现在指的是任何产品,而不仅仅是“起始”对象。

有没有办法使用 xpath 完成此引用?

XSLT 有一个 built-in key 机制来解析 cross-references。首先在样式表的顶层定义一个键为:

<xsl:key name="product" match="Product" use="ID" />

然后,根据 Product 的上下文,您可以:

<xsl:apply-templates select="key('product, Relationship/ID)/Name"/>

或者,您可以这样做:

<xsl:apply-templates select="../Product[ID=current()/Relationship/ID]/Name"/>

但是使用 key 更优雅也更高效。