在数组中的不同对象中查找 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 更优雅也更高效。
我目前正在 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 更优雅也更高效。