【发布时间】:2015-07-17 06:16:14
【问题描述】:
我有一个如下的xml,
<doc>
<a type="atr111"></a>
<a type="atr111"></a>
<a type="atr111"></a>
<a type="atr222"></a>
<a type="atr222"></a>
<a type="atr222"></a>
</doc>
我的要求是,
- 动态增加
id属性到具有atr111和atr222属性的节点 - 在节点内添加新节点,命名为
<newNode>,具有属性id="newAttr",属性atr111和atr222 - 将
<a>节点属性值atr111更改为atr222。
所以我的预期输出是,
<doc>
<a id="id-1" type="atr222"><newNode id="newAttr"/></a>
<a id="id-2" type="atr222"><newNode id="newAttr"/></a>
<a id="id-3" type="atr222"><newNode id="newAttr"/></a>
<a id="id-4" type="atr222"><newNode id="newAttr"/></a>
<a id="id-5" type="atr222"><newNode id="newAttr"/></a>
<a id="id-6" type="atr222"><newNode id="newAttr"/></a>
</doc>
我为获得这些输出而编写的 xsl 如下,
<xsl:template match="a" priority="1">
<!-- add new dynamic id -->
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="'id-'"/>
<xsl:number count="a[@type='atr111' or @type='atr222']" level="any"/>
</xsl:attribute>
</xsl:copy>
<!-- add newNode inside <a> node -->
<xsl:copy>
<newNode>
<xsl:attribute name="id">newAttr</xsl:attribute>
</newNode>
</xsl:copy>
</xsl:template>
<!-- change existing 'atr111' attribute value to 'atr222' -->
<xsl:template match="a/@type[. = 'atr111']">
<xsl:attribute name="type">atr222</xsl:attribute>
</xsl:template>
我目前的输出如下,
<doc>
<a id="id-1"/><a><newNode id="newAttr"/></a>
<a id="id-2"/><a><newNode id="newAttr"/></a>
<a id="id-3"/><a><newNode id="newAttr"/></a>
<a id="id-4"/><a><newNode id="newAttr"/></a>
<a id="id-5"/><a><newNode id="newAttr"/></a>
<a id="id-6"/><a><newNode id="newAttr"/></a>
</doc>
正如您所见,动态 id 已按预期添加,带有新属性的 <newNode> 也已添加。但它复制了 <a> 节点。现有属性type 也消失了。
如何组织我的代码以获得预期的输出?
【问题讨论】: