对于每个循环,基于xslt中的2个元素

时间:2014-07-08 11:44:39

标签: xslt

我有一个要求,我需要在每个记录上重复循环,并且需要在每次出现时都使用子字符串。我的子元素有多次出现,每个元素都要分别映射。

来源xml。

<Records>
   <Record>
      <A><C1>A record information</C1></A>
      <B><C1>B record information</C1></B>
      <C><C1></C1></C>
      <D><C1>D record information</C1></D>
      <E><C1/></E>
      <F><C1>F record formation</C1></F>
      <G><C1>P1 LABOR P1 IN G1</C1></G>
      <G><C1>*P2 LABOR P2 IN G1</C1></G>
      <G><C1>P3 LABOR P3 IN G1</C1></G>
      <F><C1>F 2nd record information</C1></F>
      <G><C1>P1 LABOR P1 IN G1</C1></G>
      <G><C1>*P2 LABOR P2 IN G1</C1></G>
      <G><C1>P3 LABOR P3 IN G1</C1></G>
   </Record>
   <Record>
      <A><C1>A record information</C1></A>
      <B><C1>B record information</C1></B>
      <C><C1><C1></C>
      <D><C1>D record information</C1></D>
      <E><C1/></E>
      <F><C1>F record information</C1></F>
      <G><C1>P1 LABOR P1 IN G1</C1></G>
      <G><C1>*P2 LABOR P2 IN G1</C1></G>
      <G><C1>P3 LABOR P3 IN </C1></G>
      <F><C1>F 2nd record information</C1></F>
      <G><C1>P1 LABOR P1 IN G1</C1></G>
      <G><C1>*P2 ABOR P2 IN G1</C1></G>
      <G><C1>P3 LABOR P3 IN G1</C1></G>
   </Record>
</Records>

我的预期结果如下。

`        <Records>
    <Record>
      <A>
        <C1>cord infor</C1>
      </A>
      <B>
        <C1>cord infor</C1>
      </B>
      <C>
        <C1></C1>
      </C>
      <D>
        <C1>cord infor</C1>
      </D>
      <E>
        <C1/>
      </E>
      <F>
        <C1>record form</C1>
      </F>
      <G>
        <C1>LABOR P1 IN LABOR P3 IN</C1>
      </G>
      <F>
        <C1>record form</C1>
      </F>
      <G>
        <C1>LABOR P1 IN LABOR P3 IN</C1>
      </G>
    </Record>
    <Record>
      <A>
        <C1>cord infor</C1>
      </A>
      <B>
        <C1>cord infor</C1>
      </B>
      <C>
        <C1></C1>
      </C>
      <D>
        <C1>cord infor</C1>
      </D>
      <E>
        <C1/>
      </E>
      <F>
        <C1>record form</C1>
      </F>
      <G>
        <C1>LABOR P1 IN LABOR P3 IN</C1>
      </G>
      <F>
        <C1>record form</C1>
      </F>
      <G>
        <C1>LABOR P1 IN LABOR P3 IN</C1>
      </G>
    </Record>
  </Records> `enter code here

对于每个记录我需要分别用子串函数映射元素。 并且需要通过消除以*

开头的G记录来对第一次出现F的G元素进行分组

每个F和G的出现次数是动态的。 已尝试使用或运算符,但如果我在元素名称上方打开一个循环,则无法连接G元素。

请帮忙。

1 个答案:

答案 0 :(得分:0)

  

我需要在2个F之间连接所有G元素,同时连接   G记录,需要避免以*

开头的G记录

要回答这个问题 - 这个问题:

以下样式表首先复制除G以外的XML文档中的所有节点,这些节点由专用模板抑制。第三个模板添加一个G元素,连接F元素后面的所有G元素的内容,除了那些以'*'开头的元素:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="g" match="G" use="generate-id(preceding-sibling::F[1])" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="G"/>

<xsl:template match="G[preceding-sibling::*[1][self::F]]">
    <G><C1>
        <xsl:for-each select="key('g', generate-id(preceding-sibling::F[1]))[not(starts-with(C1, '*'))]">
            <xsl:value-of select="C1"/>
        </xsl:for-each>
    </C1></G>
</xsl:template>

</xsl:stylesheet>

应用于以下测试输入

<Records>
   <Record>
      <A><C1>A record information</C1></A>
      <B><C1>B record information</C1></B>
      <C><C1></C1></C>
      <D><C1>D record information</C1></D>
      <E><C1/></E>
      <F><C1>F1 record information</C1></F>
      <G><C1>alpha</C1></G>
      <G><C1>*bravo</C1></G>
      <G><C1>charlie</C1></G>
      <F><C1>F2 record information</C1></F>
      <G><C1>red</C1></G>
      <G><C1>*green</C1></G>
      <G><C1>blue</C1></G>
   </Record>
   <Record>
      <A><C1>A record information</C1></A>
      <B><C1>B record information</C1></B>
      <C><C1></C1></C>
      <D><C1>D record information</C1></D>
      <E><C1/></E>
      <F><C1>F3 record information</C1></F>
      <G><C1>Adam</C1></G>
      <G><C1>*Betty</C1></G>
      <G><C1>Cecil</C1></G>
      <F><C1>F4 record information</C1></F>
      <G><C1>100</C1></G>
      <G><C1>*200</C1></G>
      <G><C1>300</C1></G>
   </Record>
</Records>

结果是:

<?xml version="1.0" encoding="UTF-8"?>
<Records>
   <Record>
      <A>
         <C1>A record information</C1>
      </A>
      <B>
         <C1>B record information</C1>
      </B>
      <C>
         <C1/>
      </C>
      <D>
         <C1>D record information</C1>
      </D>
      <E>
         <C1/>
      </E>
      <F>
         <C1>F1 record information</C1>
      </F>
      <G>
         <C1>alphacharlie</C1>
      </G>
      <F>
         <C1>F2 record information</C1>
      </F>
      <G>
         <C1>redblue</C1>
      </G>
   </Record>
   <Record>
      <A>
         <C1>A record information</C1>
      </A>
      <B>
         <C1>B record information</C1>
      </B>
      <C>
         <C1/>
      </C>
      <D>
         <C1>D record information</C1>
      </D>
      <E>
         <C1/>
      </E>
      <F>
         <C1>F3 record information</C1>
      </F>
      <G>
         <C1>AdamCecil</C1>
      </G>
      <F>
         <C1>F4 record information</C1>
      </F>
      <G>
         <C1>100300</C1>
      </G>
   </Record>
</Records>