Похоже, JAXP позволяет присвоить узлу документа любое значение, включая ‹,>, & и другие. Игра с зарезервированными символами XML и XSLT вызывает вопрос. Рассмотрим следующий код:
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
...
Element field = doc.createElement("col");
field.setTextContent( "<p>&]]" );
row.appendChild( field );
...
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("templateName.xsl"));
Transformer transformer = factory.newTransformer(xslt);
transformer.transform( new DOMSource(doc), new StreamResult(printer) );
Теперь, если у нас есть
<xsl:value-of select="col" disable-output-escaping="yes"/>
в "templateName.xsl" результат будет выглядеть так:
"<p>&]]"
и если у нас есть это
<xsl:value-of select="col"/>
вывод будет
<p>&]]
поэтому в основном мой вопрос заключается в том, какое внутреннее представление данных использует JAXP, чтобы это
"<p>&]]"
в порядке? Это не может быть ни текстовый узел, ни узел CDATA. Что это? Я считаю, что для преобразования должен быть предоставлен действующий XML-документ. С другой стороны, атрибут disable-output-escaping указывает, что специальные символы должны выводиться как есть, означает ли это, что наш узел "col" сохраняется, как в коде? Почему тогда XML-документ действителен?