2012-02-24 3 views

ответ

6

Использование processing-instruction() узловое испытание.

+1

Кирилл, этот ответ слишком общий - вы не предоставляете определенное выражение XPath, которое выбирает именно требуемый PI. –

5

Как правило, команда обработки может быть выбрана с использованием теста узла processing-instruction().

В частности, в качестве аргумента можно указать имя (цель) требуемого узла PI.

Применение:

/processing-instruction('xml-stylesheet') 

Это выбирает любой инструкции обработки с именем xsl-stylesheet, который определен на глобальном уровне (это родственный верхнего элемента).

Обратите внимание, что xsl:stylesheet является недопустимой целью PI для PI. Двоеточие ':' используется для разграничения префикса пространства имен от локального имени - однако команда обработки target не может принадлежать пространству имен. В соответствии с W3c XPath Specification:

«Инструкция обработки имеет расширенное имя: локальная часть целевой инструкции обработки, пространства имен URI, является нулевым

Также в соответствии с W3C документа: "Associating Style Sheets with XML documents 1.0», цель ПИ, которая связывает таблицу стилей в документ XML должен быть:. "xml-stylesheet" - не "xsl:stylesheet""xsl-stylesheet" или

Вот полный пример:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/processing-instruction('xml-stylesheet')"/> 
</xsl:template> 
</xsl:stylesheet> 

Когда это преобразование применяется к следующему документу XML:

<?xml-stylesheet type="text/xsl" href="test"?> 
<Books> 
    <Book name="MyBook" /> 
</Books> 

выражение XPath вычисляется и выбранный узел ПИ выводится:

<?xml-stylesheet type="text/xsl" href="test"?> 
+11

Я вижу, что вы по-прежнему придерживаетесь своих старых трюков ... Удаление и повторная отправка ответа на отбрасывание голосов - прямое злоупотребление: как люди решают оценить ваши ответы, это их решение, а не ваше. Пожалуйста, воздержитесь от этого. – Shog9

+0

Does '/ processing-instruction ('xml-stylesheet')' выбрать вещи с именем 'xsl-stylesheet'? Это было бы волшебством! Обратите внимание на 'xml' vs' xsl'. –

+0

@MicheldeRuiter, да, это так. Это формально определено здесь (третий абзац снизу): http://www.w3.org/TR/xpath/#node-tests –

0

шляпой обработка-инструкции две части цели и данные с синтаксисом:

<?target data?> 

Если вы используете:

<xsl:value-of select="/processing-instruction('xml-stylesheet')" /> 

Он будет возвращать только часть данных, в примере Dimitre Novatchev, он возвращает:

type="text/xsl" href="test" 

Так строковое значение инструкции обработки является частью данных. оценивается выражение <xsl:value-of, и результирующий объект преобразуется в строку, как неявный вызов функции string().

Смежные вопросы