XPath ДОЛЖЕН работать с SAX, и большинство процессоров XSLT (особенно Saxon и Apache Xalan) поддерживают выполнение выражений XPath внутри XSLT в потоке SAX без создания всего dom.
Им удается сделать это, примерно, следующим образом:
- Изучение выражений XPath, которым они должны соответствовать
- Получение событий SAX и тестирование, если этот узел нужен или потребуется для одного из выражений XPath.
- Игнорирование события SAX, если оно бесполезно для выражений XPath.
- Буферизация, если это необходимо
Как они буферизуют, это также очень интересно, потому что, в то время как некоторые просто создают фрагменты DOM тут и там, другие используют очень оптимизированные таблицы для быстрого поиска и уменьшения потребления памяти.
То, сколько им удастся оптимизировать, во многом зависит от типа запросов XPath, которые они находят. Как ясно объясняет уже опубликованная саксонская документация, запросы, которые перемещаются «вверх», а затем проходят «горизонтально» (брат или сестра) документа, очевидно, требуют наличия всего документа, но для большинства из них требуется лишь несколько узлов. RAM в любой момент.
Я почти уверен в этом, потому что, когда я все еще делал веб-приложение каждый день, используя Cocoon, у нас возникала проблема с объемом памяти XSLT каждый раз, когда мы использовали выражение "// что-то" внутри XSLT, и довольно часто нам приходилось переработать выражения XPath для лучшей оптимизации SAX.