判断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 文档,它基本上采用 fruitId
或 vegetableId
中的值,具体取决于哪一个可用。 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
我下面有两个不同的 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 文档,它基本上采用 fruitId
或 vegetableId
中的值,具体取决于哪一个可用。 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