Как обнаружить вложенные списки в XML с помощью выражения XPath в PowerShell? - PullRequest
0 голосов
/ 21 февраля 2019

Мы используем сценарий 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 Ответ

0 голосов
/ 21 февраля 2019
# 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-запроса, который просто ищет вложенный список items , который автоматически охватываетсписки <OL> и <UL>;исходный запрос был:
//OL//UL | //UL//OL | //OL//OL | //UL//UL

...