我有一个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 / 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>
可能包含在可调用或可应用(可能使用模式)模板中。