The issue is indeed with the entry element...
<entry xmlns="http://www.symplectic.co.uk/vivo/"
The xmlns attribute here is actually a namespace declaration. Or rather, because it does declare a prefix (like xmlns:api does) it is the default namespace. This means the entry element and its child tag element belong to the namespace.
Now, your xslt is doing this...
<xsl:value-of select="$xmlfile/entry/tag"/>
This is looking for entry and tag elements that belong to NO namespace. These are different to elements with the same name that do belong to a namespace.
The solution is to declare the namespace, with a prefix, in the XSLT, like so
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:vivo="http://www.symplectic.co.uk/vivo/">
Then change your xslt expression to look like this
<xsl:value-of select="$xmlfile/vivo:entry/vivo:tag"/>
Note the actual prefix is no important, but the namespace url must match.