Как обнаружить вложенные списки в XML с помощью выражения XPath в PowerShell?
Мы используем сценарий PowerShell и таблицу стилей XSLT для публикации заметок о выпуске в формате HTML и ODT на нашем веб-сайте для клиентов. Но любые вложенные списки в заметках о выпуске не отображаются в файле ODT. Мы скажем нашим техническим писателям больше не создавать заметки о выпуске с вложенными списками, но в случае, если они это сделают, мы хотим, чтобы наш скрипт остановился и возвратил ошибку, если он обнаружит какие-либо вложенные списки.
Как мне написать выражение XPath (чтобы добавить к нашему существующему скрипту PowerShell), которое
- останавливает публикацию скрипта и
- возвращает ошибку, если обнаруживает вложенные списки (в необработанном xml примечаний к выпуску)?
Например, в приведенной ниже заметке о выпуске xml есть маркированный список (), вложенный в нумерованный список (). Я хочу добавить что-то в наш скрипт PowerShell, чтобы обнаружить это и все другие сценарии вложенного списка (OL внутри OL, UL внутри UL, OL внутри UL).
<shortDescription>Pricing Platform</shortDescription>
<note><P>We've added these new features:</P>
<P>
<OL>
<LI>A new Summary Report.</LI>
<LI>Price Scheme page: We've added a mandatory priority setting to the Price Scheme page.</LI>
<LI>A new Management page, where you can edit each screen's type.</LI>
<LI>The following search criteria have been added to the Pricing page:
<UL>
<LI>name</LI>
<LI>cinema</LI>
<LI>status</LI>
</UL>
</LI>
</OL>
1 ответ
# Sample document.
$xmlDoc = [xml] @'
<xml>
<shortDescription>Pricing Platform</shortDescription>
<note><P>We've added these new features:</P>
<P>
<OL>
<LI>A new Summary Report.</LI>
<LI>Price Scheme page: We've added a mandatory priority setting to the Price Scheme page.</LI>
<LI>A new Management page, where you can edit each screen's type.</LI>
<LI>The following search criteria have been added to the Pricing page:
<UL>
<LI>name</LI>
<LI>cinema</LI>
<LI>status</LI>
</UL>
</LI>
</OL>
</P>
</note>
</xml>
'@
#'# Execute an XPath query that looks for nested lists of either type
# in any combination, anywhere in the document hierarchy.
# If it returns at least one node, $hasNestedLists will contain $true.
$hasNestedLists = [bool] (Select-Xml -Xml $xmlDoc -XPath '//LI//LI')
if ($hasNestedLists) { Throw "Nested lists found." }
Наконечник шляпы Michael Kay для обеспечения намного более простого //LI//LI
Запрос XPath, который просто ищет вложенные элементы списка, который автоматически охватывает оба <OL>
а также <UL>
списки; исходный запрос был:
//OL//UL | //UL//OL | //OL//OL | //UL//UL