2010-05-04 134 views
1

我尝试通过XSLT更改我的XML文件。 该文件是这样的:通过xslt合并具有相同名称的节点

<A1> 
<A2> 
<A3> 
<b>a</b> 
<b>b</b> 
... 
</A3> 
</A2> 
</A1> 
<A1> 
<A2> 
<A3> 
<b>1</b> 
<c>2</c> 
</A3> 
</A2> 
</A1> 
... 

结果应该是:

<A1> 
<A2> 
<A3> 
<b>a, b</b> 
</A3> 
</A2> 
</A1> 
<A1> 
<A2> 
<A3> 
<b>1</b> 
<c>2</c> 
</A3> 
</A2> 
</A1> 

任何人可以帮助我与!!!! 问候

+1

那么,合并背后的逻辑是什么?请编辑您的问题并描述它。 – 2010-05-04 16:16:27

+0

我改变了问题。我不确定我是否可以描述这一点。应该合并具有相同名称的节点(合并在exp中),但不是所有节点都只有名称为b的节点。问题是:xml文件不具有相同的结构。这意味着有时候b有3个“父母”有时候会有2,4,...有没有解决方案? – MADAL 2010-05-05 07:15:46

回答

0

这在很大程度上取决于一些你没有提到的,像往常一样是孩子元素的顺序(即将它永远是<b><b><c>或可能它是<b><c><b>)的东西,是元素始终的孩子<A3>元素。

对于上述XML我写了一个模板来处理该元素如下:

<xsl:template match="A3"> 
    <A3> 
    <xsl:for-each select="*"> 
      <xsl:choose> 
        <xsl:when test="following-sibling::*[name()=current()/name()] and not(preceding-sibling::*[name()=current()/name()])"> 
         <xsl:element name="{name()}"> 
         <xsl:for-each select="self::* | following-sibling::*[name()=current()/name()]"> 
           <xsl:value-of select="."/> 
           <xsl:if test="position() != last()">,</xsl:if> 
          </xsl:for-each> 
          </xsl:element> 
         </xsl:when> 
        <xsl:when test="not(following-sibling::*[name()=current()/name()]) and preceding-sibling::*[name()=current()/name()]"> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:copy-of select="."/> 
          </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
     </A3> 
</xsl:template> 

有可能是这样做的一个简单的方法,但这至少是一种方式。它可能会很慢,具体取决于您针对特定节点的子元素数量。

相关问题