diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/src/javafx/fxml/FXMLLoader.java
--- a/javafx-fxml/src/javafx/fxml/FXMLLoader.java	Fri Jan 04 17:27:02 2013 -0800
+++ b/javafx-fxml/src/javafx/fxml/FXMLLoader.java	Mon Jan 07 16:03:34 2013 +0100
@@ -87,6 +87,7 @@
 import com.sun.javafx.fxml.expression.Expression;
 import com.sun.javafx.fxml.expression.ExpressionValue;
 import com.sun.javafx.fxml.expression.KeyPath;
+import java.net.MalformedURLException;
 
 /**
  * Loads an object hierarchy from an XML document.
@@ -274,172 +275,210 @@
 
         @SuppressWarnings("unchecked")
         public void processPropertyAttribute(Attribute attribute) throws IOException {
-            String value = attribute.value;
-
-            if (value.startsWith(ESCAPE_PREFIX)) {
-                value = value.substring(ESCAPE_PREFIX.length());
-
-                if (value.length() == 0
-                    || !(value.startsWith(ESCAPE_PREFIX)
-                        || value.startsWith(RELATIVE_PATH_PREFIX)
-                        || value.startsWith(RESOURCE_KEY_PREFIX)
-                        || value.startsWith(EXPRESSION_PREFIX)
-                        || value.startsWith(BI_DIRECTIONAL_BINDING_PREFIX))) {
+            String value = attribute.value;            
+            if (isBindingExpression(value)) {            
+                // Resolve the expression
+                Expression expression;
+
+                if (attribute.sourceType != null) {
+                    throw new LoadException("Cannot bind to static property.");
+                }
+
+                if (!isTyped()) {
+                    throw new LoadException("Cannot bind to untyped object.");
+                }
+
+                // TODO We may want to identify binding properties in processAttribute()
+                // and apply them after build() has been called
+                if (this.value instanceof Builder) {
+                    throw new LoadException("Cannot bind to builder property.");
+                }
+
+                value = value.substring(BINDING_EXPRESSION_PREFIX.length(),
+                        value.length() - 1);
+                expression = Expression.valueOf(value);
+
+                // Create the binding
+                BeanAdapter targetAdapter = new BeanAdapter(this.value);
+                ObservableValue<Object> propertyModel = targetAdapter.getPropertyModel(attribute.name);
+                Class<?> type = targetAdapter.getType(attribute.name);
+
+                if (propertyModel instanceof Property<?>) {
+                    ((Property<Object>)propertyModel).bind(new ExpressionValue(namespace, expression, type));
+                }                                     
+            } else if (isBidirectionalBindingExpression(value)) {
+                throw new UnsupportedOperationException("This feature is not currently enabled.");
+            } else {
+                processValue(attribute.sourceType, attribute.name, value);
+            }
+        }
+        
+        private boolean isBindingExpression(String aValue) {
+            return aValue.startsWith(BINDING_EXPRESSION_PREFIX)
+                   && aValue.endsWith(BINDING_EXPRESSION_SUFFIX);                    
+        }
+        
+        private boolean isBidirectionalBindingExpression(String aValue) {
+            return aValue.startsWith(BI_DIRECTIONAL_BINDING_PREFIX);
+        }
+        
+        private boolean processValue(Class sourceType, String propertyName, String aValue) 
+            throws LoadException {
+            
+            boolean processed = false;
+                //process list or array first
+                if (sourceType == null && isTyped()) {
+                    BeanAdapter valueAdapter = getValueAdapter();
+                    Class<?> type = valueAdapter.getType(propertyName);
+
+                    if (type == null) {
+                        throw new PropertyNotFoundException("Property \"" + propertyName
+                            + "\" does not exist" + " or is read-only.");
+                    }                    
+                    
+                    if (List.class.isAssignableFrom(type)
+                        && valueAdapter.isReadOnly(propertyName)) {
+                        populateListFromString(valueAdapter, propertyName, aValue);
+                        processed = true;
+                    } else if (type.isArray()) {
+                        applyProperty(propertyName, sourceType, 
+                                populateArrayFromString(type, aValue));
+                        processed = true;
+                    }
+                }
+                if (!processed) {                                        
+                    applyProperty(propertyName, sourceType, resolvePrefixedValue(aValue));                    
+                    processed = true;
+                }
+                return processed;
+        }
+        
+        /**
+         * Resolves value prefixed with RELATIVE_PATH_PREFIX and RESOURCE_KEY_PREFIX.
+         */
+        private String resolvePrefixedValue(String aValue) throws LoadException {
+            if (aValue.startsWith(ESCAPE_PREFIX)) {
+                aValue = aValue.substring(ESCAPE_PREFIX.length());
+
+                if (aValue.length() == 0
+                    || !(aValue.startsWith(ESCAPE_PREFIX)
+                        || aValue.startsWith(RELATIVE_PATH_PREFIX)
+                        || aValue.startsWith(RESOURCE_KEY_PREFIX)
+                        || aValue.startsWith(EXPRESSION_PREFIX)
+                        || aValue.startsWith(BI_DIRECTIONAL_BINDING_PREFIX))) {
                     throw new LoadException("Invalid escape sequence.");
                 }
-
-                applyProperty(attribute.name, attribute.sourceType, value);
-            } else if (value.startsWith(RELATIVE_PATH_PREFIX)) {
-                value = value.substring(RELATIVE_PATH_PREFIX.length());
-
-                if (value.startsWith(RELATIVE_PATH_PREFIX)) {
+                return aValue;
+            } else if (aValue.startsWith(RELATIVE_PATH_PREFIX)) {
+                aValue = aValue.substring(RELATIVE_PATH_PREFIX.length());
+                if (aValue.length() == 0) {
+                    throw new LoadException("Missing relative path.");
+                }
+                if (aValue.startsWith(RELATIVE_PATH_PREFIX)) {
                     // The prefix was escaped
                     warnDeprecatedEscapeSequence(RELATIVE_PATH_PREFIX);
-                    applyProperty(attribute.name, attribute.sourceType, value);
+                    return aValue;
                 } else {
-                    if (value.length() == 0) {
-                        throw new LoadException("Missing relative path.");
+                    try {
+                        return (aValue.charAt(0) == '/') ? 
+                                classLoader.getResource(aValue.substring(1)).toString() : 
+                                new URL(FXMLLoader.this.location, aValue).toString();
+                    } catch (MalformedURLException e) {
+                        System.err.println(FXMLLoader.this.location + "/" + aValue);
                     }
-
-                    URL location;
-                    if (value.charAt(0) == '/') {
-                        location = classLoader.getResource(value.substring(1));
-                    } else {
-                        if (FXMLLoader.this.location == null) {
-                            throw new LoadException("Base location is undefined.");
-                        }
-
-                        location = new URL(FXMLLoader.this.location, value);
-                    }
-
-                    applyProperty(attribute.name, attribute.sourceType, location);
+                }                        
+            } else if (aValue.startsWith(RESOURCE_KEY_PREFIX)) {
+                aValue = aValue.substring(RESOURCE_KEY_PREFIX.length());
+                if (aValue.length() == 0) {
+                    throw new LoadException("Missing resource key.");
                 }
-            } else if (value.startsWith(RESOURCE_KEY_PREFIX)) {
-                value = value.substring(RESOURCE_KEY_PREFIX.length());
-
-                if (value.startsWith(RESOURCE_KEY_PREFIX)) {
+                if (aValue.startsWith(RESOURCE_KEY_PREFIX)) {
                     // The prefix was escaped
                     warnDeprecatedEscapeSequence(RESOURCE_KEY_PREFIX);
-                    applyProperty(attribute.name, attribute.sourceType, value);
-                } else {
-                    if (value.length() == 0) {
-                        throw new LoadException("Missing resource key.");
-                    }
-
+                    return aValue;
+                } else {                    
                     // Resolve the resource value
                     if (resources == null) {
                         throw new LoadException("No resources specified.");
                     }
-
-                    if (!resources.containsKey(value)) {
-                        throw new LoadException("Resource \"" + value + "\" not found.");
+                    if (!resources.containsKey(aValue)) {
+                        throw new LoadException("Resource \"" + aValue + "\" not found.");
                     }
 
-                    applyProperty(attribute.name, attribute.sourceType, resources.getObject(value));
+                    return resources.getString(aValue);
                 }
-            } else if (value.startsWith(EXPRESSION_PREFIX)) {
-                value = value.substring(EXPRESSION_PREFIX.length());
-
-                if (value.startsWith(EXPRESSION_PREFIX)) {
+            } else if (aValue.startsWith(EXPRESSION_PREFIX)) {
+                aValue = aValue.substring(EXPRESSION_PREFIX.length());
+                if (aValue.length() == 0) {
+                    throw new LoadException("Missing expression.");
+                }                
+                if (aValue.startsWith(EXPRESSION_PREFIX)) {
                     // The prefix was escaped
                     warnDeprecatedEscapeSequence(EXPRESSION_PREFIX);
-                    applyProperty(attribute.name, attribute.sourceType, value);
-                } else if (value.equals(NULL_KEYWORD)) {
+                    return aValue;
+                } else if (aValue.equals(NULL_KEYWORD)) {
                     // The attribute value is null
-                    applyProperty(attribute.name, attribute.sourceType, null);
-                } else {
-                    if (value.length() == 0) {
-                        throw new LoadException("Missing expression.");
-                    }
-
-                    // Resolve the expression
-                    Expression expression;
-                    if (value.startsWith(BINDING_EXPRESSION_PREFIX)
-                        && value.endsWith(BINDING_EXPRESSION_SUFFIX)) {
-                        if (attribute.sourceType != null) {
-                            throw new LoadException("Cannot bind to static property.");
-                        }
-
-                        if (!isTyped()) {
-                            throw new LoadException("Cannot bind to untyped object.");
-                        }
-
-                        // TODO We may want to identify binding properties in processAttribute()
-                        // and apply them after build() has been called
-                        if (this.value instanceof Builder) {
-                            throw new LoadException("Cannot bind to builder property.");
-                        }
-
-                        value = value.substring(1, value.length() - 1);
-                        expression = Expression.valueOf(value);
-
-                        // Create the binding
-                        BeanAdapter targetAdapter = new BeanAdapter(this.value);
-                        ObservableValue<Object> propertyModel = targetAdapter.getPropertyModel(attribute.name);
-                        Class<?> type = targetAdapter.getType(attribute.name);
-
-                        if (propertyModel instanceof Property<?>) {
-                            ((Property<Object>)propertyModel).bind(new ExpressionValue(namespace, expression, type));
-                        }
-                    } else {
-                        applyProperty(attribute.name, attribute.sourceType, Expression.get(namespace, KeyPath.parse(value)));
-                    }
+                    return null;
+                } 
+                return Expression.get(namespace, KeyPath.parse(aValue));
+            }
+            return aValue;
+        }
+        
+        /**
+         * Creates an array of given type and populates it with values from 
+         * a string where tokens are separated by ARRAY_COMPONENT_DELIMITER.
+         * If token is prefixed with RELATIVE_PATH_PREFIX a value added to 
+         * the array becomes relative to document location.
+         */
+        private Object populateArrayFromString(
+                Class<?>type,
+                String stringValue) throws LoadException {
+            
+            Object propertyValue = null;
+            // Split the string and set the values as an array
+            Class<?> componentType = type.getComponentType();
+
+            if (stringValue.length() > 0) {
+                String[] values = stringValue.split(ARRAY_COMPONENT_DELIMITER);
+                propertyValue = Array.newInstance(componentType, values.length);
+                for (int i = 0; i < values.length; i++) {
+                    Array.set(propertyValue, i, 
+                            BeanAdapter.coerce(resolvePrefixedValue(values[i].trim()),
+                            type.getComponentType()));
                 }
-            } else if (value.startsWith(BI_DIRECTIONAL_BINDING_PREFIX)) {
-                throw new UnsupportedOperationException("This feature is not currently enabled.");
             } else {
-                Object propertyValue = value;
-
-                if (attribute.sourceType == null && isTyped()) {
-                    BeanAdapter valueAdapter = getValueAdapter();
-                    Class<?> type = valueAdapter.getType(attribute.name);
-
-                    if (type == null) {
-                        throw new PropertyNotFoundException("Property \"" + attribute.name
-                            + "\" does not exist" + " or is read-only.");
-                    }
-
-                    if (List.class.isAssignableFrom(type)
-                        && valueAdapter.isReadOnly(attribute.name)) {
-                        // Split the string and add the values to the list
-                        List<Object> list = (List<Object>)valueAdapter.get(attribute.name);
-                        Type listType = valueAdapter.getGenericType(attribute.name);
-                        Type itemType = (Class<?>)BeanAdapter.getGenericListItemType(listType);
-
-                        if (itemType instanceof ParameterizedType) {
-                            itemType = ((ParameterizedType)itemType).getRawType();
-                        }
-
-                        String stringValue = value.toString();
-                        if (stringValue.length() > 0) {
-                            String[] values = stringValue.split(ARRAY_COMPONENT_DELIMITER);
-
-                            for (int i = 0; i < values.length; i++) {
-                                list.add(BeanAdapter.coerce(values[i].trim(), (Class<?>)itemType));
-                            }
-                        }
-
-                        propertyValue = null;
-                    } else if (type.isArray()) {
-                        // Split the string and set the values as an array
-                        Class<?> componentType = type.getComponentType();
-
-                        String stringValue = value.toString();
-                        if (stringValue.length() > 0) {
-                            String[] values = stringValue.split(ARRAY_COMPONENT_DELIMITER);
-                            propertyValue = Array.newInstance(componentType, values.length);
-                            for (int i = 0; i < values.length; i++) {
-                                Array.set(propertyValue, i, BeanAdapter.coerce(values[i].trim(),
-                                    type.getComponentType()));
-                            }
-                        } else {
-                            propertyValue = Array.newInstance(componentType, 0);
-                        }
-                    }
-                }
-
-                if (propertyValue != null) {
-                    applyProperty(attribute.name, attribute.sourceType, propertyValue);
+                propertyValue = Array.newInstance(componentType, 0);
+            }    
+            return propertyValue;
+        }
+        
+        /**
+         * Populates list with values from a string where tokens are separated 
+         * by ARRAY_COMPONENT_DELIMITER. If token is prefixed with RELATIVE_PATH_PREFIX
+         * a value added to the list becomes relative to document location.
+         */
+        private void populateListFromString(
+                BeanAdapter valueAdapter, 
+                String listPropertyName, 
+                String stringValue) throws LoadException {
+            // Split the string and add the values to the list
+            List<Object> list = (List<Object>)valueAdapter.get(listPropertyName);
+            Type listType = valueAdapter.getGenericType(listPropertyName);
+            Type itemType = (Class<?>)BeanAdapter.getGenericListItemType(listType);
+
+            if (itemType instanceof ParameterizedType) {
+                itemType = ((ParameterizedType)itemType).getRawType();
+            }
+            
+            if (stringValue.length() > 0) {
+                String[] values = stringValue.split(ARRAY_COMPONENT_DELIMITER);
+
+                for (String aValue: values) {                    
+                    aValue = aValue.trim();                              
+                    list.add(
+                            BeanAdapter.coerce(resolvePrefixedValue(aValue),
+                                               (Class<?>)itemType));
                 }
             }
         }
@@ -1642,7 +1681,7 @@
     public static final String RELATIVE_PATH_PREFIX = "@";
     public static final String RESOURCE_KEY_PREFIX = "%";
     public static final String EXPRESSION_PREFIX = "$";
-    public static final String BINDING_EXPRESSION_PREFIX = "{";
+    public static final String BINDING_EXPRESSION_PREFIX = "${";
     public static final String BINDING_EXPRESSION_SUFFIX = "}";
 
     public static final String BI_DIRECTIONAL_BINDING_PREFIX = "#{";
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/RT_27529Test.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-fxml/test/javafx/fxml/RT_27529Test.java	Mon Jan 07 16:03:34 2013 +0100
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javafx.fxml;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.ResourceBundle;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class RT_27529Test {
+    
+    @Test
+    public void testListAndArrayWithResources() throws IOException {
+        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("rt_27529_1.fxml"),
+            ResourceBundle.getBundle("javafx/fxml/rt_27529"));
+            
+        Widget widget = (Widget)fxmlLoader.load();
+        assertEquals(Arrays.asList(new String[]{"a", "b", "c"}), widget.getStyles());
+        assertTrue(Arrays.equals(new float[] {1.0f, 2.0f, 3.0f}, widget.getRatios()));
+    }
+    
+    @Test
+    public void testListAndArrayWithEscapes() throws IOException {
+        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("rt_27529_2.fxml"),
+            ResourceBundle.getBundle("javafx/fxml/rt_27529"));
+        fxmlLoader.load();
+            
+        Widget widget = (Widget)fxmlLoader.getNamespace().get("widget1");
+        assertEquals(Arrays.asList(new String[]{"@a", "%b", "$c", "@c", "%d", "$e", "a", "ABC"}), widget.getStyles());
+        assertTrue(Arrays.equals(  new String[]{"@a", "%b", "$c", "@c", "%d", "$e", "a", "ABC"}, widget.getNames()));
+    }
+    
+    @Test
+    public void testListAndArrayWithRelativePath() throws IOException {
+        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("rt_27529_3.fxml"),
+            ResourceBundle.getBundle("javafx/fxml/rt_27529"));
+            
+        Widget widget = (Widget)fxmlLoader.load();
+        assertEquals(Arrays.asList(new String[]{
+            new URL(fxmlLoader.getLocation(), "a").toString(),
+            new URL(fxmlLoader.getLocation(), "b").toString(),
+            new URL(fxmlLoader.getLocation(), "c").toString()}), widget.getStyles());
+    }
+}
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/Widget.java
--- a/javafx-fxml/test/javafx/fxml/Widget.java	Fri Jan 04 17:27:02 2013 -0800
+++ b/javafx-fxml/test/javafx/fxml/Widget.java	Mon Jan 07 16:03:34 2013 +0100
@@ -52,6 +52,7 @@
     private ArrayList<String> styles = new ArrayList<String>();
     private ArrayList<String> values = new ArrayList<String>();
     private float[] ratios = new float[]{};
+    private String[] names = new String[]{};
 
     public static final String ALIGNMENT_KEY = "alignment";
     public static final int TEN = 10;
@@ -144,6 +145,15 @@
     public void setRatios(float[] ratios) {
         this.ratios = Arrays.copyOf(ratios, ratios.length);
     }
+    
+    public String[] getNames() {
+        return Arrays.copyOf(names, names.length);
+    }
+
+    public void setNames(String[] names) {
+        this.names = Arrays.copyOf(names, names.length);
+    }
+
 
     public static Alignment getAlignment(Widget widget) {
         return (Alignment)widget.getProperties().get(ALIGNMENT_KEY);
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/rt_27529.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-fxml/test/javafx/fxml/rt_27529.properties	Mon Jan 07 16:03:34 2013 +0100
@@ -0,0 +1,6 @@
+itema=a
+itemb=b
+itemc=c
+ratio1=1.0
+ratio2=2.0
+ratio3=3.0
\ No newline at end of file
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/rt_27529_1.fxml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-fxml/test/javafx/fxml/rt_27529_1.fxml	Mon Jan 07 16:03:34 2013 +0100
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation.  Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+-->
+
+<?import javafx.fxml.*?>
+
+<Widget styles="%itema, %itemb, %itemc" ratios="%ratio1, %ratio2, %ratio3"/>
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/rt_27529_2.fxml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-fxml/test/javafx/fxml/rt_27529_2.fxml	Mon Jan 07 16:03:34 2013 +0100
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation.  Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+-->
+
+<?import javafx.fxml.*?>
+<?import java.lang.*?>
+<Widget xmlns:fx="http://javafx.com/fxml">
+    <fx:define>
+        <String fx:id="str" fx:value="ABC"/>
+    </fx:define>
+    <Widget fx:id="widget1" 
+            styles="@@a, %%b, $$c, \@c, \%d, \$e, %itema, $str" 
+            names="@@a, %%b, $$c, \@c, \%d, \$e, %itema, $str"
+            ratios="1.0, 2.0, 3.0"/>
+</Widget>
diff -r ff0f4ffc5735 -r a6beedd56fab javafx-fxml/test/javafx/fxml/rt_27529_3.fxml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javafx-fxml/test/javafx/fxml/rt_27529_3.fxml	Mon Jan 07 16:03:34 2013 +0100
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation.  Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+-->
+
+<?import javafx.fxml.*?>
+
+<Widget styles="@a, @b, @c" ratios="1.0, 2.0, 3.0"/>
