Прежде всего, если у кого-то есть другое, возможно, более короткое (или лучшее) решение проблемы, это тоже приветствуется.
Я пытаюсь «просто» удалить (почти) дублировать элементы в XSLT.Есть некоторые (метаданные) узлы, которые я не хочу включать при сравнении, и я не мог понять, как это сделать в XSLT, поэтому подумал, что я бы расширил его с помощью функции, удаляющей эти узлы.Примерно так:
<xsl:for-each select="abx:removeNodes(d/df600|d/df610|d/df611|d/df630|d/df650|d/df651|d/df655, '*[@key="i1" or @key="i2" or key="db"]')">
<xsl:if test="not(node()=preceding-sibling::*)">
blah
</xsl:if>
</xsl:for-each>
И расширение, которое работает не так хорошо ... (C #)
public XPathNodeIterator removeNodes(XPathNodeIterator p_NodeIterator, String removeXPath)
{
Logger Logger = new Logger("xslt");
Logger.Log("removeNodes(removeXPath={0}):", removeXPath);
foreach (XPathNavigator CurrentNode in p_NodeIterator)
{
Logger.Log("removeNodes(): CurrentNode.OuterXml={0}.", CurrentNode.OuterXml);
foreach (XPathNavigator CurrentSubNode in CurrentNode.Select(removeXPath))
{
Logger.Log("removeNodes(): CurrentSubNode.OuterXml={0}.", CurrentSubNode.OuterXml);
// How do i delete this node!?
//CurrentSubNode.DeleteSelf();
}
}
return p_NodeIterator;
}
Мой первоначальный подход с использованием CurrentSubNode.DeleteSelf (); 'не работает, потому что он запутывается и теряет свою позицию в XPathNavigator, в результате чего он удаляет только первый найденный элемент, используя «removeXPath».Было бы неплохо что-то вроде DeleteAndMoveNext (), но, похоже, такого метода нет ...
Пример данных:
<df650>
<df650 key="i1"> </df650>
<df650 key="i2">0</df650>
<df650 key="a">foo</df650>
<df650 key="x">bar</df650>
<df650 key="db">someDB</df650>
<df650 key="id">b2</df650>
<df650 key="dsname">someDS</df650>
</df650>
.. а затем еще один идентичный узел (есливы игнорируете мета-поля; db, id, dsname).
<df650>
<df650 key="i1"> </df650>
<df650 key="i2">0</df650>
<df650 key="a">foo</df650>
<df650 key="x">bar</df650>
<df650 key="db">someOtherDB</df650>
<df650 key="id">b2</df650>
<df650 key="dsname">someOtherDS</df650>
</df650>
Результат должен быть ...
<df650>
<df650 key="i1"> </df650>
<df650 key="i2">0</df650>
<df650 key="a">foo</df650>
<df650 key="x">bar</df650>
</df650>