Xml XSLT-从一组相同的节点打印第一个节点
我在尝试为一组相同的节点只打印一行时遇到了一个问题,我无法为相同的节点找到类似的帖子 我有一个输入xml文件,其中包含一组相同的节点,例如:Xml XSLT-从一组相同的节点打印第一个节点,xml,xslt,muenchian-grouping,node-set,Xml,Xslt,Muenchian Grouping,Node Set,我在尝试为一组相同的节点只打印一行时遇到了一个问题,我无法为相同的节点找到类似的帖子 我有一个输入xml文件,其中包含一组相同的节点,例如: <BookDetails> <BK ISBN="123362367127" Shelf="Y" /> <BK ISBN="123362367127" Shelf="Y" /> <BK ISBN="123362367127" Shelf="Y" /> <BK ISBN="123362367127" She
<BookDetails>
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
<BK ISBN="123362367127" Shelf="Y" />
</BookDetails>
我想要的是,只打印一次这本书的信息。我认为解决我的问题的一个办法可以是明钦分组,例如按ISBN值分组,然后从组中只打印第一个
基于此,我的代码如下所示:
<xsl:key name="UniqueBKs" match="BK" use="@ISBN"/>
<xsl:template name="BookDetails">
<fo:table width="160mm" table-layout="fixed">
<fo:table-column column-width="80mm" column-number="1"/>
<fo:table-column column-width="80mm" column-number="2"/>
<fo:table-body>
<xsl:for-each select="BK[generate-id() = generate-id(key('UniqueBKs', @ISBN)[1])]">
<fo:table-row>
<xsl:apply-templates select="."/>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</xsl:template>
以及:
国际书号:
如果我的输入xml文件仅由一个BK元素组成,那么代码工作正常。如果我有多个,如上图所示,Apache FOP将返回一个与表单元格相关的错误:
“行中的列数或单元格数溢出了为该表指定的fo:table列数。”
该错误表示我正试图在表行中放置更多的表单元格,而:
a) 对于这个示例,我希望只打印1行
b) ISBN越多,生成的行越多,而不是表单元格越多
任何帮助都将不胜感激,谢谢
<xsl:for-each select="BK[1]">
<xsl:value-of select".">
</xsl:for-each>
将[1]添加到“for each select”的末尾,将只“打印”第一个匹配项。这是真的吗
<xsl:template name="BookDetails">
我想应该是这样
<xsl:template match="BookDetails">
或
生成的XML是什么样子的?您的表中每行有两个单元格吗?您是指我试图生成的表行吗??我试图生成一个pdf,但是现在它每行正好有2个单元格。是的。嗯,那么它看起来更像是一个FOP问题而不是XSLT问题。至少在我看来,您的XSLT看起来不错;该表的每行不应超过两个单元格。您是否尝试过使用BK
模板的模式?您可能有另一个应用模板,它与BK
匹配,并创建额外的列。实际上,这正是我的问题,Matthew,我不久前也发现了它。我对奇数页和偶数页使用相同的模板,但模式不同。但因为我的pdf文档只有一页,我认为FOP验证可能不在乎。我错了。谢谢你们的时间和回答。
<xsl:template match="BookDetails">
<xsl:template name="BookDetails" match="BookDetails">