XML循环以匹配行集值

时间:2014-10-21 20:04:57

标签: xml foreach xsl-fo rowset

我有一个XML数据表,如下所示。在ROWSET1_ROW中,有一个ID列表。每个ID对应于ROWSET2_ROW的一部分数据。我无法循环并将ROWSET2_ROW中的ID与ROWSET1_ROW匹配。最终,将创建一个pdf报告,该报告应显示三个不同的数据部分。从我的循环中,我不断得到要打印的ROWSET2_ROW数据的第一部分。换句话说,我得到ROWSET2_ROW数据的第一部分打印三次(重复),这是错误的。我希望我能正确解释。

<DOCUMENT>
<DATA>
<ROWSET1>
  <ROWSET1_ROW>
  <INSPECTION_FEATURE_ID>2084</INSPECTION_FEATURE_ID>
</ROWSET1_ROW>
<ROWSET1_ROW>
  <INSPECTION_FEATURE_ID>2081</INSPECTION_FEATURE_ID>
</ROWSET1_ROW>
<ROWSET1_ROW>
  <INSPECTION_FEATURE_ID>2113</INSPECTION_FEATURE_ID>
</ROWSET1_ROW>
</ROWSET1>
<ROWSET2>
<ROWSET2_ROW>
  <INSPECTION_FEATURE_ID>2084</INSPECTION_FEATURE_ID>
  <SECONDARY_FEATURE_ID>0018-LAF-01</SECONDARY_FEATURE_ID>
  <INSPECTION_FEATURE>Embankment</INSPECTION_FEATURE>
</ROWSET2_ROW><ROWSET2_ROW>
  <INSPECTION_FEATURE_ID>2081</INSPECTION_FEATURE_ID>
  <SECONDARY_FEATURE_ID>0119-LAF-67</SECONDARY_FEATURE_ID>
  <INSPECTION_FEATURE>Sand Boil</INSPECTION_FEATURE>
</ROWSET2_ROW><ROWSET2_ROW>
  <INSPECTION_FEATURE_ID>2113</INSPECTION_FEATURE_ID>
  <SECONDARY_FEATURE_ID>2009-WAC-99</SECONDARY_FEATURE_ID>
  <INSPECTION_FEATURE>Seepage</INSPECTION_FEATURE>
</ROWSET2_ROW>
</DOCUMENT>
</DATA>

我尝试了以下代码,但我一直收到错误 - &gt; &#34; FO:流&#34;缺少子元素。我已尝试过这段代码的一些变体,比如删除when语句或更改循环,但如果我没有收到错误,我只会打印第一部分或ROWSET2_ROW数据三次(DUplicated)。

<xsl:for-each select=".//ROWSET1_ROW/INSPECTION_FEATURE_ID">
        <xsl:for-each select="//ROWSET2_ROW/INSPECTION_FEATURE_ID">
<xsl:when test="//ROWSET1_ROW//INSPECTION_FEATURE_ID = //ROWSET2_ROW//INSPECTION_FEATURE_ID">
<fo:table>
            <fo:table-column column-width="3in"/>
            <fo:table-column column-width="4.5in"/>



            <fo:table-body>
              <fo:table-row>
                <fo:table-cell padding-top="0.02in">
                  <fo:block>
                    <fo:table>
                      <fo:table-column column-width="1in"/>
                      <fo:table-column column-width="1.85in"/>
                      <fo:table-body>
                      <fo:table-row>
                          <fo:table-cell xsl:use-attribute-sets="cell cell-label">
                            <fo:block>
                              Inspection Feature Id
                            </fo:block>
                          </fo:table-cell>
                          <fo:table-cell xsl:use-attribute-sets="cell" font-weight="bold">
                            <fo:block>
                              <xsl:value-of select="//ROWSET2_ROW/INSPECTION_FEATURE_ID"/>
                            </fo:block>
                          </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                          <fo:table-cell xsl:use-attribute-sets="cell cell-label">
                            <fo:block>
                              Site Id
                            </fo:block>
                          </fo:table-cell>
                          <fo:table-cell xsl:use-attribute-sets="cell" font-weight="bold">
                            <fo:block>
                              <xsl:value-of select="//ROWSET2_ROW/SECONDARY_FEATURE_ID"/>
                            </fo:block>
                          </fo:table-cell>
                        </fo:table-row>
                        <fo:table-row>
                          <fo:table-cell xsl:use-attribute-sets="cell cell-label">
                            <fo:block>
                              Feature
                            </fo:block>
                          </fo:table-cell>
                          <fo:table-cell xsl:use-attribute-sets="cell">
                            <fo:block>
                              <xsl:value-of select="//ROWSET2_ROW/INSPECTION_FEATURE"/>
                            </fo:block>
                          </fo:table-cell>
                        </fo:table-row>
  </fo:table-body>
</fo:table>
</xsl:when>
</xsl:for-each>
</xsl:for-each>

对此的任何帮助将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:0)

构建表时,行

<xsl:value-of select="//ROWSET2_ROW/INSPECTION_FEATURE_ID"/>

抓取它找到的第一个匹配项,这就是rowset2数据重复的原因。

您必须删除嵌套的for-each:

 <xsl:for-each select="//ROWSET2_ROW/INSPECTION_FEATURE_ID">

for-each尝试为每个Rowset2元素运行循环,但您真正想要的是处理Rowset1元素并向每个元素添加一些数据。

在表格中,您需要一个声明说明&#34;找到行集2的数据,该行数据的INSPECTION_FEATURE_ID与当前处理的节点I的ID匹配&#34;

这就像

那样
<xsl:value-of select="sibling::ROWSET2_ROW[INSPECTION_FEATURE_ID = ./INSPECTION_FEATURE_ID]"/>

(尚未检查此语法)