Рассмотрим XSLT , специализированный язык, предназначенный для преобразования файлов XML, который может обрабатывать пространства имен по умолчанию и удалять элементы без зацикливания.PowerShell может взаимодействовать с пространством имен * .NET System.Xml.Xsl для запуска сценариев XSLT 1.0.
В частности, в XSLT объявляется префикс для пространства имен по умолчанию, здесь используется gpo , затем запустите преобразование идентичности , чтобы скопировать весь документ как есть, и передайте пустые шаблоны для элементов CreatedTime и ModifiedTime .Поэтому в любом месте эти элементы, отображаемые в документе, будут удалены без зацикливания или ссылки на родительские теги.Кроме того, при таком подходе, если вам нужно внести другие конструктивные изменения в XML, вы легко можете сделать это в сценарии XSLT, не касаясь сценария PowerShell.
XSLT (сохранить как.xsl-файл, специальный XML-файл)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gpo="http://www.microsoft.com/GroupPolicy/Settings">
<xsl:output indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- EMPTY TEMPLATES TO REMOVE -->
<xsl:template match="gpo:CreatedTime|gpo:ModifiedTime"/>
</xsl:stylesheet>
XSLT Demo
PowerShell
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
$xslt.Load("C:\Path\To\XSLT_Script.xsl");
$xslt.Transform("C:\Path\To\Input.xml", "C:\Path\To\Output.xml");