You can't do this in a single pass.
Well, maybe I should clarify.
If you look at the way a triangle rasterizer works, is that it takes a bunch of triangles and puts them on the screen. But, for each pixel, it checks its z value to a value in the z-buffer. If the z of the pixel that wants to be drawn is greater than the pixel that was already there, the z in the z-buffer is set to that value and the pixel on the screen is set to that pixel.
However, you might be able to work around this, like so:
// render polygons
Now you read from the z-buffer, but you don't write to it. This way, every pixel is drawn regardless of depth. However, this probably won't work for you. It will mean that some background triangles will be rendered on top of foreground triangles.
What you want to do is split the rendering into two passes: a normal pass and a pass for alpha-transparent polygons. When you render the second batch, you can look up the color of the pixel behind the one you're drawing and alpha blend with it.