Я хочу сравнить атрибуты двух xml-файлов и идентификатора, преобразуя входной файл в тот же шаг. Выходной файл xml должен содержать только элементы, атрибуты которых присутствуют при сравнении xml. Как показано в данном примере, последняя концепция узел не должен быть выведен, так как нет атрибута соответствия в comparing.xmlПреобразование идентичности - сравнение атрибутов и выход предельных значений
Input.xml
<navigation
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<facets>
<facet id="d1e12000000000000000000000011111">
<title xml:lang="en">sometxt</title>
<title xml:lang="de">eintxt</title>
<concepts>
<concept id="d1e12000000000000000000000000000">
<title xml:lang="en">sometxt</title>
<title xml:lang="de">eintxt</title>
<concepts>
<concept id="d1e19000000000000000000000000000">
<title xml:lang="en">sometxt</title>
<title xml:lang="de">eintxt</title>
<concepts>
</concepts>
</concept>
</concepts>
</concept>
</concepts>
</facet>
</facets>
часть comparing.xml с неопределенным заголовком-уровней
<foo>
<heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">Myheading</heading>
<chapter>
<heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">myheading</heading>
<operation>
<heading class="d1e12000000000000000000000011111|d1e12000000000000000000000000000">another heading</heading>
</operation>
</chapter>
желательно output.xml с
<nav:navigation
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nav="http://www.nav.de/">
<nav:facets>
<nav:facet id="d1e12000000000000000000000011111">
<nav:title xml:lang="en">sometxt</nav:title>
<nav:title xml:lang="de">eintxt</nav:title>
<nav:concepts>
<nav:concept id="d1e12000000000000000000000000000">
<nav:title xml:lang="en">sometxt</nav:title>
<nav:title xml:lang="de">eintxt</nav:title>
<nav:concepts>
</nav:concepts>
</nav:concept>
</nav:concepts>
</nav:facet>
</nav:facets>
мой XSL применимо только идентификаторам до сих пор
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nav="http://www.nav.de/"
version="2.0" >
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:variable name="docu" select="document(comparing.xml)"/>
<xsl:template match="*">
<xsl:element name="nav:{name()}" namespace="http://www.nav.de/">
<xsl:copy-of select="namespace::*"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
EDIT: извините за размещение этого в замечании сечении. Я пытался что-то вдоль этих линий, но это не сработало
<xsl:template match="concept | facet">
<xsl:variable name="foo-id" select="@id"/>
<xsl:for-each select="$docu//heading">
<xsl:if test="contains(./@class, $foo-id)">
<xsl:apply-templates/>
</xsl:if>
</xsl:for-each>
</xsl:template>
** 1. * * У вас есть контроль над форматом 'compareing.xml'? Использование "|" ограниченный список является ненужным осложнением. Если вы используете XML, используйте его правильно и поместите каждое значение в отдельный узел. - ** 2. ** Предполагаете ли вы сравнивать данное значение 'id' с ** любым **' class' - независимо от родителя или уровня? –
** 1. ** К сожалению, у меня нет контроля над форматом, извините. ** 2. ** точно! например: Если 'class' содержит' id', тогда выведите '' или '' элементы; если нет, то не выводите их –
DTR9000