【问题标题】:External XML for culture-specific text / Translation mapping文化特定文本/翻译映射的外部 XML
【发布时间】:2011-05-10 13:48:51
【问题描述】:

我们正在构建一个系统,该系统从数据库中获取 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示例 sn-p

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

这是一种改进吗?

【问题讨论】:

  • 好问题,+1。请参阅我的回复,了解您所有问题的具体答案以及高效实施示例的提示。

标签: xml performance xpath xslt-1.0


【解决方案1】:

小问题翻译/文化特定系统 看起来合乎逻辑?

是的

有效率吗?

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

我创建了一个伪动态 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 基于键的高效查找——即使在 SO。另请参阅this one

【讨论】:

  • @Dimitre,感谢您的指点和链接。我想我理解了关键概念,但看到大多数用途是属性搜索,而我的则是基于节点名(2 级深度)。 this approach 是一种改进吗?
  • @Gaby:键值只是一个字符串。它可以由属性、节点名称...任何其他字符串或连接构建。
  • @Gaby:不要求密钥必须来自属性。你可以在这里看到很多使用密钥的例子:dpawson.co.uk/xsl/sect2/N4852.html
  • @Dimitre,我让它与节点一起工作,但想要对实际实现发表评论(我评论中的链接)。我已经用我的解决方案更新了我的答案。如果您愿意对此发表评论,我将不胜感激。
  • @Gaby:我不会使用两个键。我会使用一个键,其索引是$objecttype$nodename 的串联。
【解决方案2】:

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

另一种选择可能是从 xslt(查看 here)或 C#(查看 here)调用 java 函数。这有多个优点

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

【讨论】:

  • +1,感谢您的链接。第一个概念很好,但我更喜欢让它尽可能不可知,所以我避免直接​​使用变量,这会被覆盖。我的结构有点深。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多