<xsl:sort select="*[name()=$article_sorting]" /> allow you to sort by the value any child element, but it doesn't allow you to supply a completely arbitrary sort key at run-time. If you want a completely general solution, consider <xsl:sort select="saxon:evaluate($x)"/> where $x can hold any XPath expression - the trouble is this isn't available in all products.
If you don't want a completely general solution but just one of a number of possible sort keys, you can try multiple sort keys:
<xsl:for-each...
<xsl:sort select="*[name()=$article_sorting]" />
<xsl:sort select="article_groups[$article_sorting='']/article_group[name="Quality"]/value"/>
If $article-sorting is "" the first sort key has no effect, if it is not "" then the second sort key has no effect.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference