代码之家  ›  专栏  ›  技术社区  ›  Gabriele Petrioli

用于区域性特定文本/翻译映射的外部XML

  •  1
  • Gabriele Petrioli  · 技术社区  · 14 年前

    我们正在构建一个从数据库获取XML数据的系统,使用XSLT将其转换为XHTML,同时使用外部XML文件检索特定于区域性的标签( 我们标签的翻译 ).

    简短问题
    翻译/文化特定系统是否合乎逻辑?有效率吗?

    欢迎任何其他概念( 在这个特定的背景下 )


    详细问题

    XML数据

    <page id="55" objecttype="ChristianOrthodoxMonument">
     <field name="uniquename">some unique name here</field>
            .. multiple field elements here ..
    </page>
    

    XML区域性标签

    <ChristianOrthodoxMonument>
     <uniquename culture-1="Ονομασία" culture-2="Unique name" />
     <birthdate culture-1="Ημ/νία γέννησης" culture-2="Date of birth" />
    </ChristianOrthodoxMonument>
    

    现在在XSLT中,我通过了 cultureid 用于映射到标签的参数。

    XSLT ( 示例代码段 )

    <xsl:param name="cultureid" select="1" />
    <xsl:variable name="objecttype" select="/page/@objecttype" />
    

    并映射到包含在

    <xsl:variable name="culture" select="document('cultural-labels.xml')" />
    

    我创建了一个伪动态xpath

    <xsl:template name="translate">
     <xsl:variable name="nodename" select="@name" />
     <xsl:value-of select="$culture/*[name()=$objecttype]/*[name()=$nodename]/@*[name()=concat('culture-',$cultureid)]" />
    </xsl:template>
    

    每当我想得到一个字段的标签时,我都会打电话给它。

    问题A: 这个xpath是有效的还是过度的?太复杂了?
    问题B: 这种模式看起来是对的,还是我遗漏了一些重要的东西,而这些东西将成为未来的障碍?
    问题C: 有没有关于外部XML文件的类似映射技术的理论/示例?


    第二次更新 使用组合键

    钥匙

    <xsl:key name="find-node" match="*" use="concat(name(..),'!',name())"  />
    

    查找

    <xsl:template name="lookup-label">
    <xsl:param name="objecttype" />
    <xsl:variable name="nodename" select="@name" />
    <xsl:for-each select="$culture">
        <xsl:value-of select="key('find-node',concat($objecttype,'!',$nodename))/@*[name()=$culturefield]" />
    </xsl:for-each>
    </xsl:template>
    

    这是进步吗?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Community    7 年前

    简短问题 翻译/文化特定系统 似乎合乎逻辑?

    是的 .

    有效率吗?

    可以 高效——不完全是你的实现。

    我创建了一个伪动态xpath

    <xsl:template name="translate"> 
     <xsl:variable name="nodename" select="@name" /> 
     <xsl:value-of select=
      "$culture/*[name()=$objecttype]
                   /*[name()=$nodename]
                        /@*[name()=concat('culture-',$cultureid)]"
    

    />

    每当我想得到 字段的标签。

    问题A :这个xpath是有效的还是过度的?

    不,这不是有效的,因为整个XML文档将被多次遍历以找到特定的objecttype节点。

    太复杂了?

    不。

    问题B :这个模型是正确的还是我遗漏了一些重要的东西 这将证明是一个障碍 未来?

    一般来说,这个模型还可以。

    问题C :是否有类似映射的理论/示例 外部XML文件的技术?

    many examples 基于键的高效查找——即使是这样。另见 this one .

        2
  •  0
  •   Aravind Yarram    14 年前

    下面是另一种纯XSLT方法: http://docstore.mik.ua/orelly/xml/jxslt/ch08_06.htm

    另一种选择可能是从xslt调用java函数(look here )或者C#(看 here . 这有很多优点

    • 利用这些语言提供的功能/工具
    • 可以共享相同的捆绑包/翻译文件