判断XML标签是否包含元素的条件语句? (XSLT)

Conditional statement to determine if XML tag contains an element? (XSLT)

我下面有两个不同的 XML 文档:

XML 1

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Match>
    <Trades>
        <Trade fruitId="apples"/>
    </Trades>
</Match> 

XML 2

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Match2>
    <Properties>
        <foobar>123</foobar>
    </Properties>
    <Trades>
        <Trade vegetableId="eggplant"/>
    </Trades>
</Match2>

我想创建一个 XSLT 文档,它基本上采用 fruitIdvegetableId 中的值,具体取决于哪一个可用。 XSLT 应同时满足 XML1 和 XML2.

我不确定如何处理这个问题,是否应该创建一个 if 语句来检查此 Trades 标签是否包含 vegetableId 或 FruitId。我在这里有点迷路了。这是我到目前为止想到的。

我的 XSLT 尝试

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
     <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

     <xsl:template match="/">
         <xsl:apply-templates/>
     </xsl:template>

     <xsl:template match="Trades/Trade">
         <xsl: if test = "(contains(@fruitId, 'somevalue'))">
              <xsl:value-of select="@fruitId"/>
         </xsl:if>
         <xsl: if test = "(contains(@vegetableId, 'somevalue'))">
              <xsl:value-of select="@vegetableId"/>
         </xsl:if>
     </xsl:template>

</xsl:stylesheet>

我知道我的 contains 语句里面有 'somevalue',这不是我 运行 的实际代码,而是我想尝试的想法,虽然我不确定如何接近。

此外,<Match> 不同于 <Match2>

请指教。谢谢!

你可以简单地使用这样的东西。 根据您传递给转换的文档,concat() 函数中只有一个元素是非空的,因此输出中实际上只有一个值。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
     <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
     <xsl:strip-space elements="*" />

     <xsl:template match="Trades/Trade">
       <output><xsl:value-of select="concat(@fruitId,@vegetableId)"/></output>
     </xsl:template>
     
     <xsl:template match="text()"/>

</xsl:stylesheet>

看到它在这里工作(我将两个文件合并在一起进行测试):https://xsltfiddle.liberty-development.net/ei5R4up