如何拆分新元素中的子节点

How can I split subnodes in new Elements

我目前正在努力解决这个问题:

我有这个XML:

<deflist>

<term>Lorem Ipsum</term>
<def>
    <para>Lorem ipsum</para>
</def>

...

<term>Lorem ipsum</term>
<def> 
    <para>Lorem ipsum 1</para>
    <para>Lorem ipsum 2</para>
    <para>Lorem ipsum 3</para>
</def>

...
</deflist>

现在我需要将其转换为以下结构。 我现在的主要问题是 <term><def>-Elements 没有 "Container" 可以用来匹配制作 <SynonymGroups Stem="true"> 元素。

<Synonyms>
   <SynonymGroups Stem="true">
    <Word>Lorem ipsum</Word>  -->former <term>
    <Word>Lorem ipsum</Word> -->former <def>
   </SynonymGroups>

...

   <SynonymGroups Stem="true">
    <Word>Lorem ipsum</Word>  -->former <term>
    <Word>Lorem ipsum 1</Word> -->former <def>
    <Word>Lorem ipsum 2</Word> -->former <def>
    <Word>Lorem ipsum 3</Word> -->former <def>
    <Word>Lorem ipsum 4</Word> -->former <def>
   </SynonymGroups>

</Synonyms>

我当前的脚本看起来像这样

<xsl:apply-templates select="//deflist"/>
</Synonyms>
</xsl:template>

匹配 deflist..

<xsl:template match="term ">
  <xsl:element name="SynonymGroups">
    <xsl:attribute name="Stem">true</xsl:attribute>
   <xsl:element name="Word">
  <xsl:apply-templates/>
 </xsl:element>
 </xsl:element>
</xsl:template>

匹配term并使<word><SynonymGroups>

<xsl:template match="def" >
    <xsl:for-each select="para"> 
      <xsl:element name="Word">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:for-each>
</xsl:template>

最后是 <def> <para> 元素的模板。

如果我 运行 这个样式表我(自然地)得到错误的输出。

像这样:

   <SynonymGroups Stem="true">
    <Word>Lorem ipsum</Word>  -->former <term>
   </SynonymGroups>

    <Word>Lorem ipsum 1</Word> -->former <def>
    <Word>Lorem ipsum 2</Word> -->former <def>
    <Word>Lorem ipsum 3</Word> -->former <def>
    <Word>Lorem ipsum 4</Word> -->former <def>

我不知道如何将以前的 <def> 元素包含在 <SynonymGroups> 元素中。

提前致谢

好吧,如果你知道这是一个分组问题,那么你可以使用分组方法:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>

    <xsl:key name="group" match="deflist/def" use="generate-id(preceding-sibling::term[1])"/>

    <xsl:template match="deflist">
        <Synonyms>
            <xsl:apply-templates select="term"/>
        </Synonyms>
    </xsl:template>

    <xsl:template match="term">
        <SynonymGroups Stem="true">
            <Word>
                <xsl:value-of select="."/>
            </Word>
            <xsl:apply-templates select="key('group', generate-id())/para"/>
        </SynonymGroups>
    </xsl:template>

    <xsl:template match="para">
        <Word>
            <xsl:value-of select="."/>
        </Word>
    </xsl:template>
</xsl:transform>

在线 http://xsltransform.net/ncdD7m1