如果属性与值不匹配,XSLT 删除节点

问题描述 投票:0回答:1

<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 中执行此操作,因此如果有人可以为我提供示例或给我链接一篇解释如何执行此操作的文章,我将非常感激。预先感谢。

xml xslt
1个回答
0
投票

尝试 powershell 脚本

这是我的结果

<?xml version="1.0" encoding="utf-8"?>
<root>
  <record>
    <Position>
      <Customer_Cost_EUR>13.218.400.000.000.000</Customer_Cost_EUR>t&gt;
         <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)
© www.soinside.com 2019 - 2024. All rights reserved.