我目前正在努力解决这个问题:
我有这个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>
元素。
提前致谢
答案 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>