1

我在根元素中有一系列后置元素,例如

<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>

每个 posten 都有一个唯一的 id 和一个 order 属性。现在我需要将 id 为“XY”的元素移动到 id 为“AB”的元素之前,并将移动的元素“XY”的 order 属性更改为“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”相结合?

我想我错过了一些明显的东西......

4

1 回答 1

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 posten 相对于 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')"/>
于 2013-02-22T12:30:40.397 回答