我有一个要求,我需要在每个记录上重复循环,并且需要在每次出现时都使用子字符串。我的子元素有多次出现,每个元素都要分别映射。
来源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元素。
请帮忙。
答案 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>