首先,如果一个人有不同的、也许较短的(或更好的)解决问题的办法,那也是受欢迎的。
我试图“简单”去除(几乎)小口径终端中重复的内容。 有一些(元数据)的节点在比较时不想包括,而一则无法说明在异常低价竞标中如何将它延伸到职能消除这些节点。 与此类似:
<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;
}
我采用目前的第2号办法。 删除(a) 做工是因为在XPathNavigator被混为一谈并失去其立场,因此只能删除它使用“搬运XPath”发现的第一个项目。 象删除AndMoveNext(AndreMoveNext)这样的一些做法是 n的,但似乎没有这样的方法。
实例数据:
<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>