代码之家  ›  专栏  ›  技术社区  ›  Nicholas Shanks

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

  •  0
  • Nicholas Shanks  · 技术社区  · 7 年前

    我有一个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>
    

    我只能使用XSLT1.0( xsltproc

    1 回复  |  直到 7 年前
        1
  •  2
  •   Martin Honnen    7 年前

    在XSLT/xpath2或更高版本中,很容易简单地提供一个序列 (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] 根据第一个可用项进行选择。

    在XSLT1中,用简洁而优雅的方式表达这一点更加困难,也许您可以使用硬编码的 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>
    

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