【发布时间】:2021-02-01 10:18:01
【问题描述】:
我正在为一项简单的任务而苦苦挣扎。以下 XML 文件
<Root>
<Row>
<ConceptID>1</ConceptID>
<Concept>may be empty</Concept>
<TermID>2481</TermID>
<Term>screened room</Term>
<Language>EN</Language>
<Usage>forbidden</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>HEKT385057</Source>
</Row>
<Row>
<ConceptID>1</ConceptID>
<Concept>may be empty</Concept>
<TermID>6551</TermID>
<Term>shielded room</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>EKT-TD</Source>
</Row>
<Row>
<ConceptID>1</ConceptID>
<Concept>may be empty</Concept>
<TermID>6552</TermID>
<Term>unverseuchter Raum</Term>
<Language>DE</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>EKT-40</Source>
</Row>
<Row>
<ConceptID>2</ConceptID>
<Concept>may be also empty</Concept>
<TermID>2482</TermID>
<Term>low-pressure ventilator</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>Birgit</Source>
</Row>
<Row>
<ConceptID>2</ConceptID>
<Concept>may be also empty</Concept>
<TermID>2483</TermID>
<Term>LP ventilator</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>HEKT385057</Source>
</Row>
...
</Root>
我希望转换为具有以下结构和分组(ConceptID)的新 XML 文件:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NewConcept>
<ConceptID>1</ConceptID>
<Concept>may be empty</Concept>
<TermG>
<TermID>6551</TermID>
<Term>shielded room</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>EKT-TD</Source>
</TermG>
<TermG>
<TermID>6552</TermID>
<Term>unverseuchter Raum</Term>
<Language>DE</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>EKT-40</Source>
</TermG>
<TermG>
<TermID>2481</TermID>
<Term>screened room</Term>
<Language>EN</Language>
<Usage>forbidden</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>HEKT385057</Source>
</TermG>
</NewConcept>
<NewConcept>
<ConceptID>2</ConceptID>
<Concept>may be also empty</Concept>
<TermG>
<TermID>2482</TermID>
<Term>low-pressure ventilator</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>Birgit</Source>
</TermG>
<TermG>
<TermID>2483</TermID>
<Term>LP ventilator</Term>
<Language>EN</Language>
<Usage>allowed</Usage>
<StatusLanguage>new</StatusLanguage>
<Source>HEKT385057</Source>
</TermG>
</NewConcept>
...
</Root>
我当前的 XSL 文件只是将标签复制到所需的结构而不是内容
<xsl:key name="concept" match="Row" use="ConceptID" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="Row[generate-id(.)=generate-id(key('concept',ConceptID)[1])]">
<xsl:sort select="ConceptID" data-type="number"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="Row">
<NewConcept>
<xsl:apply-templates select="ConceptID" />
<xsl:apply-templates select="Concept" />
<xsl:for-each select="key('concept', ConceptID)">
<xsl:sort select="Usage"/>
<TermG>
<xsl:apply-templates select="TermID" />
<xsl:apply-templates select="Term" />
<xsl:apply-templates select="Language" />
<xsl:apply-templates select="Usage" />
<xsl:apply-templates select="StatusLanguage" />
<xsl:apply-templates select="Source" />
</TermG>
</xsl:for-each>
</NewConcept>
</xsl:template>
产生:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<NewConcept>
<ConceptID/>
<Concept/>
<TermG>
<TermID/>
<Term/>
<Language/>
<Usage/>
<StatusLanguage/>
<Source/>
</TermG>
<TermG>
<TermID/>
<Term/>
<Language/>
<Usage/>
<StatusLanguage/>
<Source/>
</TermG>
<TermG>
<TermID/>
<Term/>
<Language/>
<Usage/>
<StatusLanguage/>
<Source/>
</TermG>
</NewConcept>
...
</Root>
更换
<xsl:apply-templates select="Row[generate-id(.)=generate-id(key('concept',ConceptID)[1])]">
<xsl:sort select="ConceptID" data-type="number"/>
</xsl:apply-templates>
与
<xsl:apply-templates select="@*|node()"/>
给我正确的输出(结构和内容),但是组出现多次,这取决于组中的 man 元素的方式(例如,三个元素导致同一组的三倍)。我非常感谢能帮助我解决此任务的提示!非常感谢。
【问题讨论】:
-
请解释您尝试实现的逻辑。为什么您的预期输出只包含
ConceptID的第一组? -
XML 文件代表一个术语数据库。一个概念由不同的语言或允许和禁止的术语组成,包括多个术语。所以第一个 ID=1 的概念包含三个术语,我想对它们进行分组。 Language、Usage、Status 和 Source 是该特定术语的属性,我想将它们保留在一个名为 TermG 的新标签下
-
这不能回答我的问题。
-
对不起,我不明白你的问题。我没有发布完整的 XML 文件。我的输出当然也包含 ID2 和所有后续的,我只是在帖子中省略了它们
-
好的,现在我还添加了第二个 ID