首先,如果某人有一個不同的,也許更短(或更好)的問題解決方案,那麼也是受歡迎的。從XPathNodeIterator中刪除/刪除節點(給定XPath)
我想「簡單地」刪除(幾乎)在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>
啊,謝謝!我的數據看起來有點不同,這使得它有點棘手。節點看起來像d/df600/df600/@ i1 etc ..此外,我仍然想在調試模式下,在'調試記錄視圖'中的'正常記錄視圖'下輸出這些節點,也許我可以使用@模式屬性呢? – Hannes 2010-03-30 07:58:14
@RymdPung:你可以聲明一個' ',這樣你就可以從外部修改行爲。在適當的地方放一個'「。如果您無法根據需要調整我的代碼,請顯示您的輸入XML並指定在什麼情況下它應該看起來像什麼。 –
Tomalak
2010-03-30 09:30:27
這些數據是經過修改的(不要問我爲什麼)MarcXML格式版本(http://www.loc.gov/standards/marcxml/)。我無法在評論中發佈長消息,因此我使用數據示例編輯了原始消息。 這兩個視圖的輸出是非常不同的,所以我認爲使用XSLT的@mode來分割視圖有點乾淨。 – Hannes 2010-03-30 11:23:58