Сортировка одного XML-файла и получение следующего - PullRequest
2 голосов
/ 04 февраля 2012

Хорошо.Постараюсь объяснить, что я пытаюсь сделать ..

У меня есть XSL-файл, который читает два XML-файла.Оба XML-файла содержат слова.Один файл с английскими словами, а другой с испанскими словами (те же слова, но переведенные)

Мне удалось распечатать оба XML-файла с помощью преобразования xsl и расположить их сбоку друг от друга.

Теперь к моей маленькой проблеме.Я использую сортировку по английскому XML-файлу, чтобы слова выходили отсортированными в алфавитном порядке.

Теперь я хочу, чтобы испанские слова печатались аналогично английским, чтобы вы почувствовали перевод.

Я мог бы просто поменять местами в файле xml, но я чувствую, что меня обманывают.

Это мой файл 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>

Испанский

  </dictionary>
        </thesaurus>    
         <word type="1">Paseando</word> <!-- Stroll-->
            <word type="2">Tierno</word>  <!--Tender -->
            <word type="3">Agentes</word>  <!--Agents -->
            <word type="4">Parcial</word>  <!--Partial -->
            <word type="5">Logo</word>  <!--Logotype -->
            <word type="6">Pretender</word>  <!-- Pretend-->
            <word type="7">Color</word>  <!--Color -->
            <word type="8">Tímido</word>  <!-- Silent-->
            <word type="9">Dimientos</word>  <!--Foundations -->
            <word type="10">Grano</word>  <!--Grain -->
           </dictionary>
            </thesaurus>

И вот как я печатаю

    <xsl:apply-templates select="$doc1//*/*/word">
        <xsl:sort order="ascending"/>
    </xsl:apply-templates>

    <xsl:apply-templates select="$doc2//*/*/word">
    </xsl:apply-templates>

Спасибо

Ответы [ 3 ]

2 голосов
/ 04 февраля 2012

Использование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="dict" select="document('dictionary.xml')"/>

  <xsl:template match="/">
    <html>
      <body>
        <table>
          <xsl:apply-templates select="*/*/word">
            <xsl:sort order="ascending"/>
          </xsl:apply-templates>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="word">
    <tr>
      <td>
        <xsl:value-of select="."/>
      </td>
      <td>
        <xsl:value-of select="$dict/*/*/word[@type = current()/@type]"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

Вывод:

<html>
  <body>
    <table>
      <tr>
        <td>Agents</td>
        <td>Agentes</td>
      </tr>
      <tr>
        <td>Color</td>
        <td>Color</td>
      </tr>
      <tr>
        <td>Foundations</td>
        <td>Dimientos</td>
      </tr>
      <tr>
        <td>Grain</td>
        <td>Grano</td>
      </tr>
      <tr>
        <td>Partial</td>
        <td>Parcial</td>
      </tr>
      <tr>
        <td>Pogotype</td>
        <td>Logo</td>
      </tr>
      <tr>
        <td>Pretend</td>
        <td>Pretender</td>
      </tr>
      <tr>
        <td>Silent</td>
        <td>Tímido</td>
      </tr>
      <tr>
        <td>Stroll</td>
        <td>Paseando</td>
      </tr>
      <tr>
        <td>Tender</td>
        <td>Tierno</td>
      </tr>
    </table>
  </body>
</html>

Ввод: английские слова 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 (dictionary.xml):

<thesaurus>
  <dictionary>
    <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>
1 голос
/ 04 февраля 2012

Вот более эффективное решение с использованием клавиш .Он также является более общим, поскольку мы создаем отсортированный словарь английского языка и отдельный соответственно упорядоченный словарь испанского языка, так что эти два словаря могут использоваться для любых целей - либо параллельно, либо для перевода ограниченного числа слов:

<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) - линейная сложность.Таким образом, представленное решение является оптимальным.

1 голос
/ 04 февраля 2012

Возможно, Фелипе ищет решение, в котором весь тезаурус со всеми языками является входным XML. Я немного изменил решение Кирилла, чтобы учесть эту возможность.

Используемый мною ввод (включая значение языка для испанской секции) приведен ниже.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <html>
      <body>
        <table>
          <xsl:apply-templates select="*/*[language='Engelska']/word">
            <xsl:sort order="ascending"/>
          </xsl:apply-templates>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="word">
    <tr>
      <td>
        <xsl:value-of select="."/>
      </td>
      <td>
        <xsl:value-of select="//*/*[language='Espagnol']/word[@type = current()/@type]"/>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

Введите:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <dictionary>
    <language>Espagnol</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>

Выход: такой же, как у Кирилла.

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