Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-从一组相同的节点打印第一个节点_Xml_Xslt_Muenchian Grouping_Node Set - Fatal编程技术网

Xml XSLT-从一组相同的节点打印第一个节点

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

我在尝试为一组相同的节点只打印一行时遇到了一个问题,我无法为相同的节点找到类似的帖子

我有一个输入xml文件,其中包含一组相同的节点,例如:

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