If you look at the wml ObjectFactory, you'll see:
Using java Syntax Highlighting
    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link Text }{@code >}}
     * 
     */
    @XmlElementDecl
(namespace 
= "http://schemas.openxmlformats.org/wordprocessingml/2006/main", name 
= "instrText", scope 
= R.
class)
    public JAXBElement
<Text
> createRInstrText
(Text value
) {
        return new JAXBElement
<Text
>(_RInstrText_QNAME, Text.
class, R.
class, value
);
    }
 Parsed in 0.012 seconds,  using 
GeSHi 1.0.8.4
 
  In other words, w:instrText is represented by JAXBElement<Text>, and that object "knows" it is instrText, via QName("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "instrText");
It is only when you "unwrap" (XmlUtils.unwrap) the JAXBElement that you are left with a bare Text element.  The traversal code does this 
Using java Syntax Highlighting
        /**
         * If an object is wrapped in a JAXBElement, return the object.
         * Warning: be careful with this. If you are copying objects
         * into your document (rather than just reading them), you'll
         * probably want the object to remain wrapped (JAXB usually wraps them
         * for a reason; without the wrapper, you'll (probably?) need an 
         * @XmlRootElement annotation in order to be able to marshall ie save your
         * document).
         * 
         * @param o
         * @return
         */
        public static Object unwrap
(Object o
) {
                
                if (o
==null) return null;
                
                if (o 
instanceof javax.
xml.
bind.
JAXBElement) {
                        log.
debug("Unwrapped " + ((JAXBElement
)o
).
getDeclaredType().
getName() );
                        log.
debug("name: " + ((JAXBElement
)o
).
getName() );
                        return ((JAXBElement
)o
).
getValue();
                } else {
                        return o
;
                }
                
        }
 Parsed in 0.012 seconds,  using 
GeSHi 1.0.8.4
 
  This (JAXBElement) is the pattern which is followed wherever the underlying XML schemas use a complex type for several elements.  In this case:
Using xml Syntax Highlighting
        <xsd:complexType name="CT_Text">
                <xsd:annotation>
                        <xsd:appinfo>
                                <jaxb:class name="Text"/>
                        </xsd:appinfo>
                </xsd:annotation>
                <xsd:simpleContent>
                        
                        <xsd:extension base="ST_String">
                                <xsd:attribute ref="xml:space" use="optional">
                                        <xsd:annotation>
                                                <xsd:documentation>Content Contains Significant
                                                        Whitespace
</xsd:documentation>
                                        </xsd:annotation>
                                </xsd:attribute>
                        </xsd:extension>
                </xsd:simpleContent>
        </xsd:complexType>
                        <xsd:element name="instrText" type="CT_Text">
                                <xsd:annotation>
                                        <xsd:documentation>Field Code
</xsd:documentation>
                                </xsd:annotation>
                        </xsd:element>
 Parsed in 0.001 seconds,  using 
GeSHi 1.0.8.4