Может ли преобразование XSLT 1.0 использоваться в качестве чистого оценщика пути к местоположению XPath 1.0? - PullRequest
1 голос
/ 28 июня 2011

Пожалуйста, извините, если следующие вопросы могут показаться глупыми, но из-за моей неопытности я не могу быть уверен в надежности этого метода.

Я пытаюсь создать себе XPath 1.0 путь к местоположению оценщик с использованием XSLT 1.0.

Идея проста.Преобразование принимает на вход выражение xpath для оценки, а затем применяет шаблоны к выбранным узлам.Шаблон для каждого типа узла определен для копирования узла (и некоторой дополнительной информации) на выходе.Входной документ будет явно преобразован с использованием процессора, совместимого с XSLT 1.0.

  • Что бы я хотел узнать из вашего опыта, является ли этот подход абсолютно , падение-free и надежный способ проверки путей к местоположению и отображения выбранных наборов узлов.Я не прошу кого-то отлаживать мой код.Я проверил на различных входных документов, и, кажется, работает правильно.Я хотел бы знать, если я что-то упускаю с точки зрения XPath.

  • Будет ли это работать правильно с любой XPath 1.0 путь местоположения ?

  • Будет ли этоограничено XPath 1.0 / XSLT 1.0?Я не вижу никаких противопоказаний для расширения шаблона до XPath 2.0, просто изменив его версию (и, очевидно, процессор XSLT).

Вот преобразование, которое следует использовать в качестве тестера XPath.Примечание:

  • Я опустил шаблоны для комментариев и пи-узлов, чтобы преобразование не было слишком тяжелым, но в настоящее время они управляются аналогичным образом.
  • Это не такнеобходимо управлять пространствами имен на данный момент.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="path-expr" select="*"/>

    <xsl:template match="/">
        <xpath-tester>
            <node-sets count="{count($path-expr)}">
                <xsl:apply-templates select="$path-expr" mode="path-expr"/>
            </node-sets>
        </xpath-tester>
    </xsl:template>

    <xsl:template match="node()|@*" mode="path-expr">
        <node-set
            position="{position()}"
            id="{generate-id()}" 
            parent-id="{name(parent::*[1])}-{generate-id(parent::*[1])}">
            <xsl:apply-templates select="." mode="output"/>
        </node-set>
    </xsl:template>

    <xsl:template match="*" mode="output">
        <xsl:attribute name="type">element</xsl:attribute>
        <node>
            <xsl:copy-of select="."/>
        </node>
    </xsl:template>

    <xsl:template match="@*" mode="output">
        <xsl:attribute name="type">attribute</xsl:attribute>
        <node>
            <xsl:copy-of select="."/>
        </node>
    </xsl:template>

    <xsl:template match="text()" mode="output"> 
        <xsl:attribute name="type">text</xsl:attribute>
        <node>
            <xsl:copy-of select="."/>
        </node>
    </xsl:template>

</xsl:stylesheet>

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Звучит похоже на мой любимый проект; не стесняйтесь взглянуть на мой код, он слишком большой для вставки:

http://www.flynn1179.net/xml/FullDisplayXml.xslt

Он преобразует любой XML-документ в html-страницу со сворачиваемыми узлами, и, изменяя атрибут «match» ключа ближе к вершине, вы можете указать XPath для узлов, а также создать список их или выделить их. в источнике.

Я задал очень похожий вопрос: Как передать параметр в xslt, который можно использовать в xsl: key? , хотя я пытался применить параметр к ключ, который не работает.

NB. Этот код находится в стадии разработки, местами он уродлив, и я уверен, что есть некоторые вещи, которые он не обрабатывает должным образом или может сделать лучше, но, надеюсь, он будет полезен. Я использую его производную на своей странице в изолированной программной среде XML: http://www.flynn1179.net/xml/ (это также в процессе разработки, я знаю, что в нем есть пара ошибок)

1 голос
/ 29 июня 2011

Вам может быть интересно посмотреть код моего 11-летнего возраста XPath Vizualizer .

Динамическая оценка в самом XSLT не поддерживается напрямую в XSLT 2.0и хотя в XSLT 3.0 / XPath 3.0 такая поддержка может быть, это вообще не нужно.

0 голосов
/ 29 июня 2011

Первый @ Мартин указал

вам потребуется поддерживаемая динамическая оценка XPath, чтобы можно было обрабатывать строку с XPath как набор узлов

Я немного расширил преобразование для обработки динамической оценки XPath. Теперь преобразование может принять входную строку и преобразовать ее в XPath.

Теперь это саксонская зависимость, как при использовании saxon:evaluate. Аналогичным образом и с поддержкой function-available можно реализовать другие расширения и сделать это более переносимым.

Здесь три новых шаблона (и два новых параметра), которые заменяют корневой шаблон в моем исходном преобразовании (с учетом объявления пространства имен xmlns:saxon="http://icl.com/saxon").

    <xsl:param name="path-expr" select="false()"/>
    <xsl:param name="xpath" select="*"/>

    <xsl:template match="/">
        <xsl:choose>
            <xsl:when test="$path-expr">
                <xsl:apply-templates select="/" mode="dyn"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="/" mode="base"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="/" mode="dyn">
        <xpath-tester>
            <node-sets count="{count(saxon:evaluate($path-expr))}">
                <xsl:apply-templates select="saxon:evaluate($path-expr)" 
                    mode="path-expr"/>
            </node-sets>
        </xpath-tester>
    </xsl:template>

    <xsl:template match="/" mode="base">
        <xpath-tester>
            <node-sets count="{count($xpath)}">
                <xsl:apply-templates select="$xpath" 
                  mode="path-expr"/>
            </node-sets>
        </xpath-tester>
    </xsl:template>

Второй @ Мартин указал

Я подозреваю, что у вас возникнут проблемы с выводом узлов атрибутов и элементов вместе

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...