Reputation: 511
I'm receiving XML like the following from a web service call and want to output the text of a message, only if it does not have a PRIVATE label.
<MessageStore>
<MessageDetails>
<Text>Message1</Text>
<Labels>
<Label>PRIVATE</Label>
</Labels>
</MessageDetails>
<MessageDetails>
<Text>Message2</Text>
<Labels>
<Label>PRIVATE</Label>
</Labels>
</MessageDetails>
<MessageDetails>
<Text>Message3</Text>
<Labels>
<Label>PRIVATE</Label>
<Label>PUBLIC</Label>
</Labels>
</MessageDetails>
<MessageDetails>
<Text>Message4</Text>
<Labels>
<Label>PUBLIC</Label>
<Label>PRIVATE</Label>
</Labels>
</MessageDetails>
<MessageDetails>
<Text>Message5</Text>
<Labels>
<Label>PUBLIC</Label>
</Labels>
</MessageDetails>
</MessageStore>
I've tried the following XSLT, but if a message has both private + public labels, its text is still outputted. E.g. "Message3 Message4 Message5". What I want is only "Message 5".
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="MessageDetails">
<xsl:if test="Labels/Label[not(contains(text(), 'PRIVATE'))]">
<xsl:value-of select="Text" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Upvotes: 2
Views: 58
Reputation: 6218
The following XPath (in your xsl:if
element) should work:
not(Labels/Label = 'PRIVATE')
Upvotes: 1