对一些人来说,这可能是一个简单的问题,但对我来说,这已经是几天的噩梦了。
我想更改此XML:
<?xml version="1.0" encoding="UTF-8"?>
<questionnaire>
<Id>questionnaireId</Id>
<Desc>questionnnaireDesc here</Desc>
<QuestParts>
<part>
<partNumber>1</partNumber>
<questItems>
<item>
<itemId>1</itemId>
<itemText>The first item</itemText>
</item>
</questItems>
</part>
<part>
<partNumber>1</partNumber>
<questItems>
<item>
<itemId>2</itemId>
<itemText>The second item</itemText>
</item>
</questItems>
</part>
<part>
<partNumber>2</partNumber>
<questItems>
<item>
<itemId>3</itemId>
<itemText>A third item, but inside part 2</itemText>
</item>
</questItems>
</part>
<part>
<partNumber>2</partNumber>
<questItems>
<item>
<itemId>4</itemId>
<itemText>A fourth item, but inside part 2</itemText>
</item>
</questItems>
</part>
</QuestParts>
</questionnaire>
到此:
<questionnaire>
<Id>questionnaireId</Id>
<Desc>questionnnaireDesc here</Desc>
<QuestParts>
<part>
<partNumber>1</partNumber>
<questItems>
<item>
<itemId>1</itemId>
<itemText>The first item</itemText>
</item>
<item>
<itemId>2</itemId>
<itemText>The second item</itemText>
</item>
</questItems>
</part>
<part>
<partNumber>2</partNumber>
<questItems>
<item>
<itemId>3</itemId>
<itemText>A third item, but inside part 2</itemText>
</item>
<item>
<itemId>4</itemId>
<itemText>A fourth item, but inside part 2</itemText>
</item>
</questItems>
</part>
</QuestParts>
</questionnaire>
换句话说,我只想删除重复的元素,并将属于该部分的所有项目分组到该部分的元素中。
我已经尝试了很多方法,尽管有很多例子,但我找不到任何真正适合我的方法,我想避免再花两天时间为别人5分钟内就能解决的问题而挣扎。
非常感谢您的帮助。
Greg
Greg,
通过提供的示例链接,我成功地使用了以下XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="partnr" match="part" use="partNumber" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="QuestParts">
<QuestParts>
<xsl:for-each select="part[generate-id(.)=generate-id(key('partnr',partNumber))]">
<xsl:variable name="curpartnr" select="partNumber" />
<partNumber><xsl:value-of select="$curpartnr" /></partNumber>
<questItems>
<xsl:for-each select="../part[generate-id(.)=generate-id(key('partnr',partNumber))]/questItems/item">
<item>
<itemId><xsl:value-of select="itemId" /></itemId>
<itemText><xsl:value-of select="itemText" /></itemText>
</item>
</xsl:for-each>
</questItems>
</xsl:for-each>
</QuestParts>
</xsl:template>
</xsl:stylesheet>
希望能有所帮助。