2012-11-23 22 views
0
<Request xmlns:ns0="http://Request"> 
    <Lines> 
    <Line> 
     <requestid>76</requestid> 
     <Code>C001</Code> 
    </Line> 
    <Line> 
     <requestid>77</requestid> 
     <Code>C002</Code> 
    </Line> 
    </Lines>  
    <Conflict> 
    <responseid>76</responseid> 
    <responsecode>WB</responsecode> 
    <cService> 
     <responseid>73</responseid> 
     <responsecode>HA</responsecode> 
    </cService> 
    <cService> 
     <responseid>7600</responseid> 
     <serviceCode>PP</serviceCode> 
    </cService> 
    </Conflict>  
    <Conflict> 
    <responseid>77</responseid> 
    <responsecode>WB7</responsecode> 
    <cService> 
     <responseid>745</responseid> 
     <responsecode>HAQ</responsecode> 
    </cService> 
    <cService> 
     <responseid>7234</responseid> 
     <serviceCode>PP</serviceCode> 
    </cService> 
    </Conflict>  
    <Conflict> 
    <responseid>77</responseid> 
    <responsecode>WBC</responsecode> 
    <cService> 
     <responseid>72341</responseid> 
     <responsecode>HAC</responsecode> 
    </cService> 
    <cService> 
     <responseid>98</responseid> 
     <responsecode>PPC</responsecode> 
    </cService> 
    </Conflict> 
</Request> 

和所需的输出应如下所示。XSLT中的条件筛选和嵌套循环

<Output xmlns:ns0="http://Response"> 
     <Lines> 
     <Line> 
      <responseid>76</responseid> 
      <code>WB</code> 
      <Features> 
      <ExistingFeature> 
       <responseid>76</responseid>       
       <CFeature> 
       <responseid>76</responseid>        
       </CFeature> 
       <CFeature> 
       <responseid>76</responseid>         
       </CFeature> 
      </ExistingFeature> 
      </Features> 
     </Line> 
     <Line> 
      <Num>77</Num> 
      <Features> 
      <ExistingFeature> 
       <responseid>77</responseid> 
       <code>WB7</code> 
       <CFeature> 
       <responseid>77</responseid>     
       </CFeature> 
       <CFeature> 
       <responseid>77</responseid>     
       </CFeature> 
       <CFeature> 
       <responseid>77</responseid>     
       </CFeature> 
      <CFeature> 
       <responseid>77</responseid>     
       </CFeature>    
      </ExistingFeature> 
      </Features> 
     </Line>   
     </Lines> 
</Output> 

所以,你可以帮助我在XSLT中实现这一点。 因为我尝试了多种方式,但无法使用,因为我在xslt中很穷。

情景。 实际上,应该为输入中的每一行创建一行,并且基于requestID(即76或77),输入中的每一行都有一个或多个冲突。 所以我必须根据输入中单个节点中的这些ID对输入中的每一行发生的冲突进行分组,以及输入中所有相应的匹配冲突。

所以你可以帮我写这个场景的xslt。

+1

这是可能做到的,但您提供了对需求的非常少的描述。例如,为什么第一个结果('Line')具有完全不同的结构('responsed'和'code),第二个'Lne'没有?????????? –

+0

你曾在xslt中尝试过 – vels4j

+0

是的。行中的RequestID和冲突节点中的ResponseID相同。所以我们必须比较Request和RepsonseID。因此在Conflict节点中可能存在一个或多个Cservice节点。但是我们不需要考虑CService节点中的ResponseID。我的意思是CService节点中的ResponseID必须根据Line(Request)和ResponseID(Request中的)RequestID在输出中的相应Line节点中填充它。 – vsbabu

回答

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="incomekey" match="/Request/Conflict" use="responseid" /> 
    <xsl:template match="/Lines" > 
    <Lines> 
     <xsl:apply-templates select="Line" /> 
    </Lines> 
    </xsl:template> 
    <xsl:template match="Line" > 
    <Line> 
     <xsl:variable name="tmp" select="requestid" /> 
     <xsl:for-each select="key('incomekey', $tmp)" > 
     <xsl:variable name="strCount" select="position()" /> 
     <xsl:if test="position() &lt; 2"> 
      <responseid> 
      <xsl:value-of select="requestid/text()" /> 
      </responseid> 
      <code> 
      <xsl:value-of select="Code/text()" /> 
      </code> 
     </xsl:if> 
     <Features> 
      <ExistingFeature> 
      <responseid> 
       <xsl:value-of select="responseid" /> 
      </responseid> 
      <code> 
       <xsl:value-of select="responsecode" /> 
      </code> 
      <xsl:for-each select="cService"> 
       <CFeature> 
       <responseid> 
        <xsl:value-of select="responseid"/> 
       </responseid>        
       </CFeature> 
      </xsl:for-each> 
      </ExistingFeature> 
     </Features> 
     </xsl:for-each> 
    </Line> 
    </xsl:template> 
</xsl:stylesheet> 

我正在使用上面的脚本。但是它如下所示生成了第二行(77)的输出。

0
<Line> 
     <responseid>77</responseid> 
     <code>WB</code> 
     <Features> 
      <ExistingFeature> 
      <responseid>77</responseid> 
      <code>WB7</code> 
      <CFeature> 
       <responseid>745</responseid> 
      </CFeature> 
      <CFeature> 
       <responseid>7234</responseid> 
      </CFeature> 
      </ExistingFeature> 
     </Features> 
      <Features> 
      <ExistingFeature> 
       <responseid>77</responseid> 
       <code>WBC</code> 
       <CFeature> 
       <responseid>72341</responseid> 
       </CFeature> 
       <CFeature> 
       <responseid>98</responseid> 
       </CFeature> 
      </ExistingFeature> 
     </Features> 
     </Line> 

如果您观察此节点,它会为请求77(RequestID)中的每个冲突节点创建两个独立的Features节点。 因此,我不需要它填充如下面在输出中的第二行节点中所示。

<Features> 
    <ExistingFeature> 
     <responseid>77</responseid> 
     <code>WB7</code> 
     <CFeature> 
     <responseid>745</responseid> 
     </CFeature> 
     <CFeature> 
     <responseid>7234</responseid> 
     </CFeature> 
     <CFeature> 
     <responseid>72341</responseid> 
     </CFeature> 
     <CFeature> 
     <responseid>98</responseid> 
     </CFeature> 
    </ExistingFeature> 
    </Features>