2013-02-22 68 views
1

我有邮元素的根元素内的层次结构,像如何移动xml元素并同时更改属性值?

<gliederung> 
    <posten id=".." order="1"> 
     <posten id=".." order"1"> 
      <posten id=".." order"1"> 
       ... 
      </posten> 
      <posten id="AB" order"2"> 
       ... 
      </posten> 
      ... 
     </posten> 
     <posten id=".." order"2"> 
      ... 
     </posten> 
     <posten id="XY" order"3"> 
      ... 
     </posten> 
    .... 
</gliederung> 

每个邮报具有唯一的ID和顺序属性。 现在我需要在id为“AB”的元素之前移动ID为“XY”的元素,并将移动元素“XY”的顺序属性更改为“1.5”。

我设法元素与下面的脚本移动:

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="posten[@id='AB']"> 
    <xsl:copy-of select="../posten[@id='XY']"/> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="posten[@id='XY']"/> 

但如何移动与改变顺序属性值为“1.5

我缺少明显的东西我想结合...

回答

1

相反的copy-of,使用模板

<!-- almost-identity template, that does not apply templates to the 
     posten[@id='XY'] --> 
<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()[not(self::posten[@id='XY'])]|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="posten[@id='AB']"> 
    <!-- apply templates to the XY posten - this will copy it using the 
      "identity" template above but will allow the specific template 
      for its order attr to fire --> 
    <xsl:apply-templates select="../posten[@id='XY']"/> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<!-- fix up the order value for XY --> 
<xsl:template match="posten[@id='XY']/@order"> 
    <xsl:attribute name="order">1.5</xsl:attribute> 
</xsl:template> 

如果您不确定XY位置相对于AB位置的确切位置(即,将它永远是../posten[@id='XY']或它有时可能../../),那么你可以定义一个

<xsl:key name="postenById" match="posten" use="@id" /> 

然后更换<xsl:apply-templates select="../posten[@id='XY']"/>

<xsl:apply-templates select="key('postenById', 'XY')"/> 
+0

酷,完美的作品! – Holger 2013-02-22 12:55:16