如何在新元素

时间:2015-10-23 14:07:47

标签: xslt xpath nodes xslt-grouping

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

我有这个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> - 元素没有&#34;容器&#34;我可以用来匹配制作<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>元素。

提前致谢

1 个答案:

答案 0 :(得分:0)

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

<?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