从优先级列表中选择元素的值

问题描述 投票:0回答:1

我有一个XML文档,可能包含不同命名空间中的等效非兄弟元素。我想从我提供的列表中获得最高优先级的值。

EG

<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)。

xslt xslt-1.0
1个回答
2
投票

在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>

可能包含在可调用或可应用(可能使用模式)模板中。

© www.soinside.com 2019 - 2024. All rights reserved.