Выберите значение элемента из списка приоритетов - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть документ XML, который может содержать эквивалентные элементы, не являющиеся братьями и сестрами, в разных пространствах имен.Я хочу получить значение с наивысшим приоритетом из списка, который я предоставляю.

например,

<ns1:thing>
  <ns1:info>
    <ns1:title>Some title</ns1:title>
  </ns1:info>
  <ns2:metadata>
    <ns2:mainTitle>Main title</ns2:mainTitle>
    <ns2:altTitle>Alt title</ns2:altTitle>
  </ns2:metadata>
  ...

Я хочу выбрать один из них и вывести его значение, но все эти элементыявляются необязательными, поэтому мне нужно будет просмотреть список и найти каждый из них, или, возможно, более похожий на XSLT, попытаться применить их последовательно и затем попробовать следующий, если элемент не может быть найден?Список приоритетов может быть, скажем, ns2:metadata/ns2:mainTitle> ns1:info/ns1:title> ns2:metadata/ns2:altTitle> "Fallback", который, учитывая все необязательные элементы, как указано выше, приведет к:

<html:title>Main title</html:title>

Я могу толькоиспользуйте XSLT 1.0 (xsltproc).

1 Ответ

0 голосов
/ 13 сентября 2018

В XSLT / XPath 2 и более поздних версиях просто предоставить последовательность (ns2:metadata/ns2:mainTitle, ns1:info/ns1:title, ns2:metadata/ns2:altTitle, 'Fallback') и затем выбрать первый (ns2:metadata/ns2:mainTitle, ns1:info/ns1:title, ns2:metadata/ns2:altTitle, 'Fallback')[1] для выбора на основе первого доступного элемента.

С XSLT 1 это сложнее выразить в компактном и элегантном виде, возможно, вы можете жить с жестко закодированным xsl:choose:

<xsl:choose>
  <xsl:when test="ns2:metadata/ns2:mainTitle">
    <xsl:value-of select="ns2:metadata/ns2:mainTitle"/>
  </xsl:when>
  <xsl:when test="ns1:info/ns1:title">
    <xsl:value-of select="ns1:info/ns1:title"/>
  </xsl:when>
  <xsl:when test="ns2:metadata/ns2:altTitle">
    <xsl:value-of select="ns2:metadata/ns2:altTitle"/>
  </xsl:when>
  <xsl:otherwise>Fallback</xsl:otherwise>
</xsl:choose>

, возможно, завернутым в вызываемый илиприменимый (возможно, использующий режим) шаблон.

...