多个记录/元素被分组以创建新结构

GL

我进行搜索并接近找到一个解决方案,但这需要Stylesheet 2.0,而我却坚持使用1.0。

这是我拥有的示例XML:

<root>
<row>A1: Apples</row>
<row>B1: Red</row>
<row>C1: Reference text</row>
<row>badly formatted text which belongs to row above</row>
<row>and here.</row>
<row>D1: ABC</row>
<row>E1: 123</row>
<row>A1: Oranges</row>
<row>B1: Purple</row>
<row>C1: More References</row>
<row>with no identifier</row>
<row>again and here.</row>
<row>D1: DEF</row>
<row>E1: 456</row>
.
.

我希望它看起来像:

<root>
<row>
    <A1>Apples</A1>
    <B1>Red</B1>
    <C1>Reference text badly formatted text which belongs to row above and here.</C1>
    <D1>ABC</D1>
    <E1>123</E1>
</row>
<row>
    <A1>Oranges</A1>
    <B1>Purple</B1>
    <C1>More Reference with no identifier again and here.</C1>
    <D1>DEF</D1>
    <E1>456</E1>
</row>
.
.

有一个模式可以使用其他实用程序进行转换,但是使用XSL 1.0很难。

我可以使用元素中的标题,并且当参考文本字段转换为XML时,它是多行的,它为每一行创建自己的行,但始终位于C1和D1之间的同一位置。元素的实际名称,即不重要。

该行应在E1之后分手。我认为我的示例很简单,但这种转换并非如此。我认为自己甚至不是XML / XSL的初学者。我从头开始学习,然后转移到其他项目,然后又要回到原来的状态。TIA。

更新:我遇到的另一种情况的结构略有不同,但我希望结果是相同的:

<root>
  <row>
    <Field>A1: Apples</Field>
  </row>
<row>
    <Field>B1: Red</Field>
</row>
<row>
    <Field>C1: Reference text</Field>
</row>
<row>
    <Field>badly formatted text which belongs to row above</Field>
</row>
<row>
    <Field>and here.</Field>
</row>
<row>
    <Field>D1: ABC</Field>
</row>
<row>
    <Field>E1: 123</Field>
</row>
<row>
    <Field>A1: Oranges</Field>
</row>
<row>
    <Field>B1: Purple</Field>
</row>
<row>
    <Field>C1: More References</Field>
</row>
<row>
   <Field>with no identifier</Field>
</row>
<row>
   <Field>again and here.</Field>
</row>
<row>
   <Field>D1: DEF</Field>
</row>
<row>
   <Field>E1: 456</Field>
</row>

我尝试应用身份转换,但似乎不起作用:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match ="row/Field">
    <xsl:apply-templates/>
</xsl:template>
柔和的紫色雨

这看起来有些棘手,但是我有一个可行的解决方案。它允许C1行之后的行数可变(尚不清楚是否总是2行)。

该解决方案大量使用了following-sibling轴,这可能效率很低,尤其是对于大型输入文件而言。

您可以在这里进行测试

<xsl:template match="/root">
    <!-- Loop through every "A1" row -->
    <xsl:for-each select="row[substring-before(text(), ':') = 'A1']">
        <!-- Add a <row> tag -->
            <xsl:element name="row">
                <!-- Add each of the A1-E1 tags by finding the first following-sibling that matches before the colon -->
                <xsl:apply-templates select="." />
                <xsl:apply-templates select="following-sibling::*[substring-before(text(), ':') = 'B1'][1]" />
                <xsl:apply-templates select="following-sibling::*[substring-before(text(), ':') = 'C1'][1]" />
                <xsl:apply-templates select="following-sibling::*[substring-before(text(), ':') = 'D1'][1]" />
                <xsl:apply-templates select="following-sibling::*[substring-before(text(), ':') = 'E1'][1]" />
            </xsl:element>
        </xsl:for-each>
    </xsl:template>

    <!-- Process each row -->
    <xsl:template match="/root/row">
        <!-- Create an element whose name is whatever is before the colon in the text -->
        <xsl:element name="{substring-before(text(), ':')}">
            <!-- Output everything after the colon -->
            <xsl:value-of select="normalize-space(substring-after(text(), ':'))" />
            <!-- Special treatment for the C1 node -->
            <xsl:if test="substring-before(text(), ':') = 'C1'">
                <!-- Count how many A1 nodes exist after this node -->
                <xsl:variable name="remainingA1nodes" select="count(following-sibling::*[substring-before(text(), ':') = 'A1'])" />
                <!-- Loop through all following-siblings that don't have a colon at position 3, and still have the same number of following A1 rows as this one does -->
                <xsl:for-each select="following-sibling::*[substring(text(), 3, 1) != ':'][count(following-sibling::*[substring-before(text(), ':') = 'A1']) = $remainingA1nodes]">
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="." />
                </xsl:for-each>
            </xsl:if>
        </xsl:element>
    </xsl:template>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL:基于多个记录创建新记录

来自分类Dev

按记录分组,生成新的ObjectId,并更改结果集结构

来自分类Dev

EF 6(例外)序列包含多个元素-插入新记录

来自分类Dev

隐藏可在一个或多个中创建新记录

来自分类Dev

在多个表中创建新记录Access 2013

来自分类Dev

无法创建新记录

来自分类Dev

无法创建新记录

来自分类Dev

FactoryGirl创建多个记录

来自分类Dev

从单个记录创建分类结构

来自分类Dev

创建未按分组的元素之和

来自分类Dev

r 创建与按另一列分组的行元素匹配的新数据框

来自分类Dev

分组+选择进入新的嵌套类结构

来自分类Dev

分组并通过在Pandas中随机分配多个字符串来创建新列

来自分类Dev

“分组依据”多个文件中的相同列并在每个文件中创建新列

来自分类Dev

在新结构中快速创建结构列表

来自分类Dev

SQL删除按多个表分组的记录

来自分类Dev

在猫鼬中分组提供多个记录

来自分类Dev

如何创建结构的新实例

来自分类Dev

为与列小部件相同的新结构创建元素插件扩展

来自分类Dev

Python:创建多个元素的滞后(t-1)数据结构

来自分类Dev

更新旧记录而不是创建新记录?

来自分类Dev

尝试使用linq创建分组记录

来自分类Dev

无法创建新的邀请记录

来自分类Dev

创建现有类别的新分组并汇总新分组

来自分类Dev

C#中多个列上的按结构分组的结构列表

来自分类Dev

使用 Rails 中的嵌套属性从表单中的复选框创建多个新记录

来自分类Dev

Cakephp更新多个记录或如果数据库中不存在id则创建一个新记录

来自分类Dev

如何避免多个用户创建多个记录?

来自分类Dev

分组,然后用多个元素进行汇总

Related 相关文章

热门标签

归档