我要编写XML到XML的转换。我的输入XML文档包含许多兄弟列表(带有子列表),我想将其转换为1个主列表(不删除子列表)。换句话说,我想在第一个兄弟列表之后压制每个兄弟列表,但保留所有子列表。
以下是输入XML文档示例:
<back>
<index id="subject">
<title>Subject Index</title>
<index id="section">
<list id="index">
<item>apple</item>
<item>almond</item>
<item>american cheese</item>
<item>Avocado
<list id="index">
<item>Mexican</item>
<item>Chilian</item>
</list>
</item>
<item>asparagus</item>
<item>anchovie</item>
</list>
</index>
<index id="section">
<list id="index">
<item>banana</item>
<item>barley</item>
<item>bagel
<list id="index">
<item>sesame</item>
<item>plain</item>
<item>everything</item>
</list>
</item>
<list id="index">
<item>bean
<list id="index">
<item>green bean</item>
<item>navy bean</item>
</list>
</item>
</list>
</list>
</index>
</index>
我想将上面的内容转换为下面的结构,其中一个主列表为id =“index”。列表中的子项应该保留,但应该禁止兄弟列表。
<back>
<index id="subject">
<title>Subject Index</title>
<list id="index">
<item>apple</item>
<item>almond</item>
<item>american cheese</item>
<item>Avocado
<list id="index">
<item>Mexican</item>
<item>Chilian</item>
</list>
</item>
<item>asparagus</item>
<item>anchovie</item>
<item>banana</item>
<item>barley</item>
<item>bagel
<list id="index">
<item>sesame</item>
<item>plain</item>
<item>everything</item>
</list>
</item>
<list id="index">
<item>bean
<list id="index">
<item>green bean</item>
<item>navy bean</item>
</list>
</item>
</list>
</list>
</index>
答案 0 :(得分:0)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="index[1]/list[1]">
<xsl:copy>
<xsl:apply-templates select="@*| ../../index/list/node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="index/index"><xsl:apply-templates/></xsl:template>
<xsl:template match="/*/*/index[position() >1]"/>
</xsl:stylesheet>
应用于提供的XML文档时:
<back>
<index id="subject">
<title>Subject Index</title>
<index id="section">
<list id="index">
<item>apple</item>
<item>almond</item>
<item>american cheese</item>
<item>Avocado
<list id="index">
<item>Mexican</item>
<item>Chilian</item>
</list></item>
<item>asparagus</item>
<item>anchovie</item>
</list>
</index>
<index id="section">
<list id="index">
<item>banana</item>
<item>barley</item>
<item>bagel
<list id="index">
<item>sesame</item>
<item>plain</item>
<item>everything</item>
</list></item>
<list id="index">
<item>bean
<list id="index">
<item>green bean</item>
<item>navy bean</item>
</list></item>
</list>
</list>
</index>
</index>
</back>
会产生想要的正确结果:
<back>
<index id="subject">
<title>Subject Index</title>
<list id="index">
<item>apple</item>
<item>almond</item>
<item>american cheese</item>
<item>Avocado
<list id="index">
<item>Mexican</item>
<item>Chilian</item>
</list>
</item>
<item>asparagus</item>
<item>anchovie</item>
<item>banana</item>
<item>barley</item>
<item>bagel
<list id="index">
<item>sesame</item>
<item>plain</item>
<item>everything</item>
</list>
</item>
<list id="index">
<item>bean
<list id="index">
<item>green bean</item>
<item>navy bean</item>
</list>
</item>
</list>
</list>
</index>
</back>