2015-11-04 4 views
0

У меня есть XML:XSLT заменить значение атрибутов, которые продублированы из родительского узла

<?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> 

Я хотел бы узнать узлы tag2, которые имеют такое же значение идентификатора в качестве значения идентификатора Узла tag1 родителей, заменяющего значение идентификатора tag2 с исходным идентификатором с суффиксом «D».

В приведенном выше примере: tag2 имеет ИД "Hij", которая является такой же, как его родительского узла 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

Используйте шаблон

<xsl:template match="tag2/@id[.=../../@id]"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="concat(., 'D')"/> 
    </xsl:attribute> 
</xsl:template> 

Вам нужно .. дважды как первый ..tag2 выбирает элемент, а второй на tag1 элемент.

Образец на http://xsltransform.net/bFN1y8Y.

Смежные вопросы