2015-10-23 21 views
0

我目前这个问题所困扰:我怎样才能在新的元件分开的子节点

我有这样的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没有“容器”,我可以使用它来匹配制作<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> 

我无法弄清楚如何包含<SynonymGroups>元素中的前<def>元素。

在此先感谢

回答

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

+0

THX伟大的工作。 – Humfre