首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -添加新属性和节点

XSLT -添加新属性和节点
EN

Stack Overflow用户
提问于 2015-07-17 06:16:14
回答 1查看 227关注 0票数 0

我有一个xml,如下所示

代码语言:javascript
复制
<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>

我的要求是,

  1. 将动态增量的id属性添加到具有属性atr111atr222的节点
  2. 在节点内添加新节点,命名为<newNode>,其属性为id="newAttr",其中具有属性atr111atr222
  3. <a>节点属性值atr111更改为atr222

所以我的预期产出是,

代码语言:javascript
复制
<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如下所示,

代码语言:javascript
复制
<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>  

我目前的输出如下,

代码语言:javascript
复制
<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>

正如您所看到的,动态it按预期的方式添加,带有新属性的<newNode>也有added.but,它复制了<a>节点。现有的属性type也消失了。

如何组织代码以获得预期的输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 06:40:22

您忘了复制type属性。<xsl:copy>只复制当前节点本身,而不复制其子节点或属性。

下面使用标识模板来复制子元素和属性。

代码语言:javascript
复制
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output encoding="UTF-8" indent="yes" />

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

    <xsl:template match="a[@type='atr111' or @type='atr222']">
        <xsl:copy>
            <xsl:attribute name="id">
                <xsl:text>id-</xsl:text>
                <xsl:number count="a[@type='atr111' or @type='atr222']" level="any" />
            </xsl:attribute>
            <xsl:apply-templates select="@*|node()" />
            <newNode id="newAttr" />
        </xsl:copy>
    </xsl:template>
</xsl:transform>

输出:

代码语言:javascript
复制
<doc>
    <a id="id-1" type="atr111"><newNode id="newAttr"/></a>
    <a id="id-2" type="atr111"><newNode id="newAttr"/></a>
    <a id="id-3" type="atr111"><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:copy-of select="@type" />,但这就不那么灵活了:通过标识模板复制使您能够传递变量输入,并在以后添加一个<xsl:template match="a/@type"> --在必要时对@type节点进行一些特殊处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31469431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档