Как обнаружить вложенные списки в XML с помощью выражения XPath в PowerShell?

Мы используем сценарий PowerShell и таблицу стилей XSLT для публикации заметок о выпуске в формате HTML и ODT на нашем веб-сайте для клиентов. Но любые вложенные списки в заметках о выпуске не отображаются в файле ODT. Мы скажем нашим техническим писателям больше не создавать заметки о выпуске с вложенными списками, но в случае, если они это сделают, мы хотим, чтобы наш скрипт остановился и возвратил ошибку, если он обнаружит какие-либо вложенные списки.

Как мне написать выражение XPath (чтобы добавить к нашему существующему скрипту PowerShell), которое

  1. останавливает публикацию скрипта и
  2. возвращает ошибку, если обнаруживает вложенные списки (в необработанном 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

Другие вопросы по тегам