XSLT-функция exslt: объектный тип в IE и Chrome

EXSLT предоставляет набор полезных расширений для XSLT. Вероятно, большинство из нас использовали функцию exslt: node-set. Одна из других функций, определяемых EXSLT, - это exslt: object-type. К сожалению, большинство браузеров (кроме Firefox), похоже, не поддерживают эту функцию. Ссылка: http://greenbytes.de/tech/tc/xslt/ Пока мне удалось реализовать эту функцию в IE с помощью скрипта, я, похоже, не нашел обходного пути для Google Chrome. (Это один из тех случаев, когда IE кажется лучше Chrome).

Основная цель моего приложения - выяснить, является ли аргумент «набором узлов» или нет. Или, если быть более точным - если аргумент можно выбрать в xsl: apply-templates.

Реализация IE может выглядеть примерно так:


    <msxso:script language="JScript" implements-prefix="exslt">  
       <![CDATA[
         this['object-type'] = function(x) {
           switch (typeof x) {
            case "number": return "number";
            case "string": return "string";
            case "object": return "node-set";
            default: return typeof x
           }        
         }
      ]]>
    </msxso:script>   

Итак, вопрос - как сделать что-то подобное в Google Chrome.

Пожалуйста, поймите, что решение состоит не в том, чтобы вручную переписывать исходную таблицу стилей, поскольку это должен быть полностью автоматизированный процесс.

Мой сценарий следующий: агент отправляет XML + XSLT, процесс автоматически перезаписывает XSLT для преобразования xsl: value-of в xsl: apply-templates. Хотя тип атрибута select для xsl: value-of не имеет значения, xsl: apply-templates завершится ошибкой, если атрибут select не может быть преобразован в набор узлов.


person user2724798    schedule 28.08.2013    source источник
comment
Я удивлен, что Chrome не поддерживает функцию object-type EXSLT, я думал, что он использует libxslt в качестве процессора XSLT, а libxslt поддерживает эту функцию. Возможно, они отключили его в Chrome, и кто-то должен сделать запрос функции, чтобы включить его.   -  person Martin Honnen    schedule 28.08.2013
comment
Ну и здесь то же самое. Я также узнал, что Chrome использует libxslt. Насколько мне известно, libxslt поддерживает объектный тип. Купите это может быть старая вилка библиотеки, которую использует Chrome.   -  person user2724798    schedule 28.08.2013


Ответы (1)


Используйте комбинацию библиотек для проверки типов:

  • XSLTSL: node: type

    <xsl:template name="node:type"><xsl:param name="node" select="."/>  ...</xsl:template>
    
  • XSieve: x: string

    (x:string (x:eval "/data//text()[not(ancestor-or-self::bad)]"))
    
person Paul Sweatte    schedule 02.12.2015
comment
могли бы вы привести пример? - person Tom McDonald; 15.07.2019