Я сомневаюсь, что в общем случае можно с помощью регулярного выражения выразить операцию удаления / добавления / замены для узла на произвольной глубине в документе XML (не говоря уже о одновременном выполнении других условий, таких какпо атрибутам, пространству имен, глубине, текстовым узлам).
Это объясняет, почему вы не можете найти такой RegEx.
С другой стороны, любая такая операциятривиально с XSLT и один пишет решение за полминуты и забывает об этой «проблеме», потому что есть действительно более важные дела.
Для записи, ниже, переименование элементаоперация (элемент amy с именем a
переименован в h
):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a">
<h>
<xsl:apply-templates/>
</h>
</xsl:template>
</xsl:stylesheet>
при применении, например, к этому документу XML :
<a>
<b>
<c>
<d/>
<a>
<b>
<e>
<f>
<c>
<d>
<a/>
</d>
</c>
</f>
</e>
</b>
</a>
</c>
</b>
</a>
желаемый, правильный результат выдается :
<h>
<b>
<c>
<d/>
<h>
<b>
<e>
<f>
<c>
<d>
<h/>
</d>
</c>
</f>
</e>
</b>
</h>
</c>
</b>
</h>