xslt替换与父节点重复的属性值

时间:2015-11-04 18:42:08

标签: xml xslt xslt-1.0

我有一个XML:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <tag1 id="abc" name="first tag">
        <tag2 id="efg" name="embedded tag1">
        </tag2>
    </tag1>
    <tag1 id="hij" name="first tag">
        <tag2 id="hij" name="embedded tag1">
        </tag2>
    </tag1>
    <LOTS OF TAG1/TAG2S>...</>
</ROOT>

我想找出与父节点tag1的id值具有相同id值的节点tag2,将tag2 id的值替换为带有后缀&#34; D&#34;的原始id。

在上面的例子中:tag2有id&#34; hij&#34;它与其父节点tag1相同,因此应替换为:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <tag1 id="abc" name="first tag">
        <tag2 id="efg" name="embedded tag1">
        </tag2>
    </tag1>
    <tag1 id="hij" name="first tag">
        <tag2 id="hijD" name="embedded tag1">
        </tag2>
    </tag1>
    <LOTS OF TAG1/TAG2S>...</>
</ROOT>

我写了一个xslt:

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

<xsl:template match="//tag2/@id[.=../tag1/@id]">
  <xsl:with-param name="id" select="@id" />
  <xsl:with-param name="extra" select="'D'" />
  <xsl:attribute name="id">
    <xsl:value-of select="concat($id,$extra)"/>
  </xsl:attribute>
</xsl:template>

没有按预期工作。 任何灯都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

使用模板

..

您需要..两次,因为第一个tag2选择tag1元素,第二个选择{{1}}元素。

样本位于http://xsltransform.net/bFN1y8Y