Получить данные из файла XML и редактировать их
Предположим, следующий пример:
У меня есть XML-файл с названием Plant.xml
<?xml version="1.0" encoding="utf-8"?>
<Plant>
<Zone Left="{PRKNG-7}">
<Data key="Bloodroot">Sanguinaria_canadensis</Data>
<Data key="Columbine">Aquilegia_canadensis</Data>
<Data key="Hepatica">Hepatica_americana</Data>
<Data key="Mayapple">Podophyllum_peltatum</Data>
</Zone>
<Direction Right="{PRKNG-8}">
<Data key="Zone">4</Data>
<Data key="Light">Shade</Data>
<Data key="Depth">Surface</Data>
<Data key="Availability">23262156</Data>
</Direction>
</Plant>
В PowerShell я хочу получить число "23262156" за "Доступностью", добавить 1 и снова сохранить XML.
Я не хочу заменять номер (так как он каждый раз отличается), просто добавьте 1, чтобы он составлял 23262157.
В следующий раз число может быть 234159, и я хочу снова добавить 1, так что это будет 234160.
Чтобы было ясно: я не хочу использовать команду "заменить". Get-Content c:\1.txt | ForEach-Object { $_ -relace "23262156", "23262157" } | Set-Content c:\1.txt Я хочу использовать что-то вроде "23262156" +1, поэтому результат будет 23262157. Потому что при следующем запуске сценария может быть другое число. Если я выполню команду "заменить", то результатом будет снова 23262157 вместо числа +1.
1 ответ
Используйте XSLT:
#transform to HTML report
$xslt=New-Object System.Xml.Xsl.XslCompiledTransform
$xslt.Load("$pwd\transform.xsl")
$xslt.Transform("$pwd\original.xml","$pwd\result.xml")
Со следующей таблицей стилей:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:template match="node()" mode="print">
<xsl:choose>
<!-- is it element? -->
<xsl:when test="name()">
<br />
<!-- start tag -->
<xsl:text><</xsl:text>
<xsl:value-of select="name()" />
<!-- attributes -->
<xsl:apply-templates select="@*" mode="print" />
<xsl:choose>
<!-- has children -->
<xsl:when test="node()">
<!-- closing bracket -->
<xsl:text>></xsl:text>
<!-- children -->
<xsl:apply-templates mode="print" />
<!-- end tag -->
<xsl:text></</xsl:text>
<xsl:value-of select="name()" />
<xsl:text>></xsl:text>
<br />
</xsl:when>
<!-- is empty -->
<xsl:otherwise>
<!-- closing bracket -->
<xsl:text>/></xsl:text><br />
<br />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<!-- text -->
<xsl:otherwise>
<xsl:copy />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@*" mode="print">
<xsl:text> </xsl:text>
<xsl:value-of select="name()" />
<xsl:text>="</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:template>
<xsl:template match="text()" mode="print">
<xsl:choose>
<xsl:when test="contains(parent::node()/@key, 'Availability')">
<xsl:value-of select="number(current()) + 1" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates mode="print" />
</xsl:template>
</xsl:stylesheet>
Который производит следующий вывод:
Как мне вывести Escape-представление XML узла в выводе моего XSLT-файла - переполнение стека
Преобразование XML в экранированный текст в XSLT - переполнение стека
Практические процессы PowerShell с автоматизацией изменений SQL - Redgate Software
технические комментарии: PowerShell Reporting With XML - часть 1