对一个xml文件进行排序,然后让另一个文件跟随

时间:2012-02-03 23:28:55

标签: xml xslt xpath

好的。将尝试解释我正在尝试做什么..

我有一个读取两个xml文件的XSL文件。两个xml文件都包含单词。一个文件包含英文单词,另一个文件包含西班牙语单词(相同的单词但已翻译)

我已经设法通过xsl转换打印出两个xml文件,并将它们放在彼此的一边。

现在我的小问题。我在英文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 个答案:

答案 0 :(得分:2)

使用:

<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 :(得分:1)

也许Felipe正在寻找一种解决方案,其中包含所有语言的整个词库是输入XML。我正在重新设计Kirill的解决方案,以迎合这种可能性。

我使用的输入(包括西班牙语部分的语言值)在下面。

<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>

输出:与基里尔相同。

答案 2 :(得分:1)

这是一个使用密钥的更有效的解决方案。它也更通用,因为我们生成一个排序的英语词典和一个单独的相应排序的西班牙语词典,这样这两个词典可以用于任何目的 - 无论是并排还是翻译有限数量的词:< / p>

<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>

在提供的eEnglish词典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) - 线性复杂度。因此,所提出的解决方案是最佳的。