Вот более эффективное решение с использованием клавиш .Он также является более общим, поскольку мы создаем отсортированный словарь английского языка и отдельный соответственно упорядоченный словарь испанского языка, так что эти два словаря могут использоваться для любых целей - либо параллельно, либо для перевода ограниченного числа слов:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kWordByType" match="word" use="@type"/>
<xsl:variable name="vDictSpanish" select=
"document('file:///c:/temp/delete/spanish.xml')"/>
<xsl:variable name="vrtfSortedEnglish">
<thesaurus>
<dictionary>
<xsl:copy-of select="/*/*/language"/>
<xsl:for-each select="/*/*/word">
<xsl:sort/>
<xsl:copy-of select="."/>
</xsl:for-each>
</dictionary>
</thesaurus>
</xsl:variable>
<xsl:variable name="vSortedEnglish"
select="ext:node-set($vrtfSortedEnglish)"/>
<xsl:template match="dictionary">
<thesaurus>
<xsl:copy-of select="$vSortedEnglish/*/dictionary"/>
<dictionary>
<xsl:copy-of select="$vDictSpanish/*/*/language"/>
<xsl:apply-templates select="$vSortedEnglish/*/*/word"/>
</dictionary>
</thesaurus>
</xsl:template>
<xsl:template match="word">
<xsl:variable name="vType" select="@type"/>
<xsl:for-each select="$vDictSpanish">
<xsl:copy-of select="key('kWordByType', $vType)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу электронного словаря :
<thesaurus>
<dictionary>
<language>Engelska</language>
<word type="1">Stroll</word>
<word type="2">Tender</word>
<word type="3">Agents</word>
<word type="4">Partial</word>
<word type="5">Pogotype</word>
<word type="6">Pretend</word>
<word type="7">Color</word>
<word type="8">Silent</word>
<word type="9">Foundations</word>
<word type="10">Grain</word>
</dictionary>
</thesaurus>
, а предоставленный XML-документ испанского словаря находится в файлев : c:/temp/delete/spanish.xml
:
<thesaurus>
<dictionary>
<language>Spanish</language>
<word type="1">Paseando</word>
<word type="2">Tierno</word>
<word type="3">Agentes</word>
<word type="4">Parcial</word>
<word type="5">Logo</word>
<word type="6">Pretender</word>
<word type="7">Color</word>
<word type="8">Tímido</word>
<word type="9">Dimientos</word>
<word type="10">Grano</word>
</dictionary>
</thesaurus>
желаемый, правильный результат получается :
<thesaurus>
<dictionary>
<language>Engelska</language>
<word type="3">Agents</word>
<word type="7">Color</word>
<word type="9">Foundations</word>
<word type="10">Grain</word>
<word type="4">Partial</word>
<word type="5">Pogotype</word>
<word type="6">Pretend</word>
<word type="8">Silent</word>
<word type="1">Stroll</word>
<word type="2">Tender</word>
</dictionary>
<dictionary>
<language>Spanish</language>
<word type="3">Agentes</word>
<word type="7">Color</word>
<word type="9">Dimientos</word>
<word type="10">Grano</word>
<word type="4">Parcial</word>
<word type="5">Logo</word>
<word type="6">Pretender</word>
<word type="8">Tímido</word>
<word type="1">Paseando</word>
<word type="2">Tierno</word>
</dictionary>
</thesaurus>
Примечание :В настоящее время принятый ответ выполняет линейный поиск в словаре испанского языка для поиска каждого подходящего испанского слова.Выполнение этого для всех N отсортированных английских слов является алгоритмом O (N ^ 2) (имеет квадратичную сложность) и не подходит для словарей реального размера.
Представленное здесь решение использует поиск ключа для поиска подходящегослово.Это имеет сложность O (1) и поиск всех слов является O (N) - линейная сложность.Таким образом, представленное решение является оптимальным.