首页 > 解决方案 > 如何替换包含特定短语的 xml 中的值

问题描述

这是我的 xml 文件

我的.xml

.
.
.
<Package name="czst-stewart-aerodrome" active="true"/>
<Package name="kden-denver" active="true"/>
<Package name="lemd-adolfo-suarez" active="true"/>
<Package name="omdb-dubai-intl" active="true"/>
<Package name="yssy-sydney" active="true"/>
.
.
.

我想将包含“kden”“lemd”“yssy”的行的“true”值替换为“false”,并保持其他行不变

这是我的代码,它完成了这项工作并将“真”值替换为“假”,但它为整行而不是上面提到的特定行完成了这项工作:

$filename = 'C:\path\to\my.xml'

[xml]$xml = Get-Content $filename
$xml.SelectNodes('//*[self::title or self::subtitle]') |
    Where-Object { $_.'#text' -match 'true' } |
    ForEach-Object { $_.'#text' = 'false' }
$xml.Save($filename)

标签: xmlxslt

解决方案


请尝试以下基于 XSLT 的解决方案。

输入 XML

<root>
    <Package name="czst-stewart-aerodrome" active="true"/>
    <Package name="kden-denver" active="true"/>
    <Package name="lemd-adolfo-suarez" active="true"/>
    <Package name="omdb-dubai-intl" active="true"/>
    <Package name="yssy-sydney" active="true"/>
</root>

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@active[.='true'][starts-with(../@name,'kden')
        or starts-with(../@name,'lemd') 
        or starts-with(../@name,'yssy')]">
        <xsl:attribute name="active">false</xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

输出 XML

<root>
  <Package name="czst-stewart-aerodrome" active="true" />
  <Package name="kden-denver" active="false" />
  <Package name="lemd-adolfo-suarez" active="false" />
  <Package name="omdb-dubai-intl" active="true" />
  <Package name="yssy-sydney" active="false" />
</root>

推荐阅读