如何拆分新元素中的子节点
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>
我目前正在努力解决这个问题:
我有这个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>