XSLT - 添加新元素和属性

时间:2015-07-16 11:38:13

标签: xml xslt xslt-2.0

我有xml如下,

<doc>
    <a ref="style1"><b>Test1</b></a>
    <a ref="style1"><b>Test2</b></a>
    <a ref="style2"><b>Test3</b></a>
</doc>

我需要在属性为<a>的{​​{1}}个节点中添加新属性和新节点。

所以我写了下面的xsl,

"style1"

我需要创建两个模板(要求)。

但我目前的输出如下,

//add attribute
<xsl:template match="a[@ref='style1']">
        <xsl:copy>
            <xsl:attribute name="id">myId</xsl:attribute>
        </xsl:copy>
    </xsl:template>

   //add new node
    <xsl:template match="a[@ref='style1']" priority="1">
        <xsl:copy>
            <newNode></newNode>
        </xsl:copy>
        <xsl:next-match/>
    </xsl:template>

如您所见,<doc> <a><newNode/></a><a id="myId"/> <a><newNode/></a><a id="myId"/> <a ref="style2"><b>Test2</b></a> </doc> 个节点已经翻倍。并且<a>个节点已经消失了。但是预计输出是这个,

<b>

如何组织我的代码以达到预期的输出?

1 个答案:

答案 0 :(得分:1)

首先,您应该只在其中一个模板中使用xsl:copy - 否则您将复制该节点。

接下来,您必须在添加任何子节点之前添加属性。

最后,为了在父项中包含新属性和现有子节点,您必须将相关指令放在xsl:copy元素中:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="a[@ref='style1']">
    <xsl:attribute name="id">myId</xsl:attribute>
</xsl:template>

<xsl:template match="a[@ref='style1']" priority="1">
    <xsl:copy>
        <xsl:next-match/>
        <newNode/>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<doc>
   <a id="myId">
      <newNode/>
      <b>Test1</b>
   </a>
   <a id="myId">
      <newNode/>
      <b>Test2</b>
   </a>
   <a ref="style2">
      <b>Test3</b>
   </a>
</doc>