我在根元素中有一个posten-elements的层次结构,类似于
<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为“AB”的元素之前移动id为“XY”的元素,并将移动元素“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?
我猜错了一些明显的东西...
答案 0 :(得分: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']
还是有时可能是../../
),那么您可以定义< / p>
<xsl:key name="postenById" match="posten" use="@id" />
然后将<xsl:apply-templates select="../posten[@id='XY']"/>
替换为
<xsl:apply-templates select="key('postenById', 'XY')"/>