<root>
<record>
<Position>
<Customer_Cost_EUR>13.218.400.000.000.000</Customer_Cost_EUR>t>
<Charge_Type>cycleCharge</Charge_Type>
<Customer_Company> GmbH + Co. KG</Customer_Company>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
<Position>
<Customer_Cost_EUR>23.510.400.000.000.000</Customer_Cost_EUR>
<Charge_Type>addQuantity</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
<Position>
<Customer_Cost_EUR>0</Customer_Cost_EUR>
<Charge_Type>new</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
</record>
<record>
<Position>
<Customer_Cost_EUR>10</Customer_Cost_EUR>
<Charge_Type>renew</Charge_Type>
<Customer_ID>98018</Customer_ID>
<Kundennummer_customer/>
</Position>
<Position>
<Customer_Cost_EUR>23.510.400.000.000.000</Customer_Cost_EUR>
<Charge_Type>addQuantity</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
<Position>
<Customer_Cost_EUR>23.510.400.000.000.000</Customer_Cost_EUR>
<Charge_Type>worktime</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
</record>
</root>
现在我想删除所有不符合 Charge_Type 'new'、'renew' 或 'cycleCharge' 的位置
这就是我的目标:
<root>
<record>
<Position>
<Customer_Cost_EUR>13.218.400.000.000.000</Customer_Cost_EUR>t>
<Charge_Type>cycleCharge</Charge_Type>
<Customer_Company>GmbH + Co. KG</Customer_Company>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
<Position>
<Customer_Cost_EUR>0</Customer_Cost_EUR>
<Charge_Type>new</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer/>
</Position>
</record>
<record>
<Position>
<Customer_Cost_EUR>10</Customer_Cost_EUR>
<Charge_Type>renew</Charge_Type>
<Customer_ID>98018</Customer_ID>
<Kundennummer_customer/>
</Position>
</record>
</root>
如果没有留下Position节点,那么记录节点也应该被删除
但是,我找不到任何文章来演示如何在 xsl 中执行此操作,因此如果有人可以为我提供示例或给我链接一篇解释如何执行此操作的文章,我将非常感激。预先感谢。
尝试 powershell 脚本
这是我的结果
<?xml version="1.0" encoding="utf-8"?>
<root>
<record>
<Position>
<Customer_Cost_EUR>13.218.400.000.000.000</Customer_Cost_EUR>t>
<Charge_Type>cycleCharge</Charge_Type><Customer_Company>Tepass Schwelm GmbH + Co. KG</Customer_Company><Customer_ID>98079</Customer_ID><Kundennummer_customer /></Position>
<Position>
<Customer_Cost_EUR>0</Customer_Cost_EUR>
<Charge_Type>new</Charge_Type>
<Customer_ID>98079</Customer_ID>
<Kundennummer_customer />
</Position>
</record>
<record>
<Position>
<Customer_Cost_EUR>10</Customer_Cost_EUR>
<Charge_Type>renew</Charge_Type>
<Customer_ID>98018</Customer_ID>
<Kundennummer_customer />
</Position>
</record>
</root>
这是脚本
using assembly System.Xml.Linq
$inputFilename = 'c:\temp\test.xml'
$outputFilename = 'c:\temp\test1.xml'
$xDoc = [System.Xml.Linq.XDocument]::Load($inputFilename)
$records = $xDoc.Descendants('record').Foreach([System.Xml.Linq.XElement])
for($i = ($records.Count) - 1; $i -ge 0; $i--)
{
$record = $records[$i]
$filteredRecords = @([System.Linq.Enumerable]::Where($record.Elements('Position'), [Func[object,bool]]{ param($x) ($x[0].Element('Charge_Type').Value -eq 'new') -or ($x[0].Element('Charge_Type').Value -eq 'renew') -or ($x[0].Element('Charge_Type').Value -eq 'cycleCharge')}))
If($filteredRecords.Count -eq 0) { $filteredRecords.Remove() }`
Else { $record.RemoveAll(); $record.Add($filteredRecords) }
}
$xDoc.Save($outputFilename)