Пожалуйста, извините, если следующие вопросы могут показаться глупыми, но из-за моей неопытности я не могу быть уверен в надежности этого метода.
Я пытаюсь создать себе 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>