1

我要编写一个 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>

4

1 回答 1

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>
于 2013-02-21T04:57:53.920 回答