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



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

假设我有一个输入对象,比如:

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

我需要能够把一个表格的格式:

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

为了构建表行,我已经完成了

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

然后"在"每个产品中,根据名称放置一个块:

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

我的问题是...选择选项来获取名称。我希望能够按照../Product[ID=./Relationship/ID]/Name的思路构建一个xpath但它不起作用,因为./现在指的是任何产品,而不仅仅是";启动";对象

有没有一种方法可以使用xpath实现这种引用?

XSLT有一个内置的机制来解决交叉引用。首先在样式表的顶层定义一个键:

<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"/>

但是使用既更优雅又更高效。

最新更新