Это не элемент XML; это XML "Инструкция по обработке". Вот почему вы не смогли найти его по вашему запросу. Чтобы найти его, вы хотите:
# Find the first xml-stylesheet PI
xss = doc.at_xpath('//processing-instruction("xml-stylesheet")')
# Find every xml-stylesheet PI
xsss = doc.xpath('//processing-instruction("xml-stylesheet")')
Видно в действии:
require 'nokogiri'
xml = <<ENDXML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/templates/disclaimer_en.xsl"?>
<root>Hi Mom!</root>
ENDXML
doc = Nokogiri.XML(xml)
xss = doc.at_xpath('//processing-instruction("xml-stylesheet")')
puts xss.name #=> xml-stylesheet
puts xss.content #=> type="text/xsl" href="/templates/disclaimer_en.xsl"
Поскольку инструкция обработки не является элементом, у нее нет атрибутов; вы не можете, например, запросить xss['type']
или xss['href']
; вам нужно будет проанализировать содержимое как элемент, если вы этого хотите. Один из способов сделать это:
class Nokogiri::XML::ProcessingInstruction
def to_element
document.parse("<#{name} #{content}/>")
end
end
p xss.to_element['href'] #=> "/templates/disclaimer_en.xsl"
Обратите внимание, что в Nokogiri или libxml2 существует ошибка, из-за которой XML-декларация для отображения в документе в виде Инструкция по обработке, если перед <?xml
есть хотя бы один символ (может быть пробел). Вот почему в приведенном выше тексте мы специально ищем инструкции по обработке с именем xml-stylesheet
.
Изменить: выражение XPath processing-instruction()[name()="foo"]
эквивалентно выражению processing-instruction("foo")
. Как описано в спецификации XPath 1.0:
Тест processing-instruction()
может иметь аргумент Literal; в этом случае это верно для любой инструкции обработки, имя которой равно значению литерала.
Я отредактировал ответ выше, чтобы использовать более короткий формат.
person
Phrogz
schedule
31.08.2012