1

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

这是一种改进吗?

4

2 回答 2

3

简短的问题 翻译/文化特定系统看起来合乎逻辑吗?

的。

高效的 ?

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

我创建了一个伪动态 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 文档将被遍历多次以找到特定的对象类型节点。

过于复杂?

不。

问题 B:这个模型看起来是正确的,还是我遗漏了一些重要的东西,而这些东西在未来会被证明是一个障碍?

模型一般都可以。

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

许多基于键的高效查找示例——即使在 SO 中也是如此。也看到这个

于 2010-11-16T02:20:57.980 回答
0

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

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

  • 利用这些语言提供的功能/工具
  • 可以共享相同的捆绑包/翻译文件
于 2010-11-16T02:36:09.127 回答