用于特定文化文本/翻译映射的外部XML

时间:2010-11-16 01:15:37

标签: xml performance xpath xslt-1.0

我们正在构建一个从数据库获取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 个答案:

答案 0 :(得分: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)]"
     

/&GT;       

     每当我想要的时候,我都会打电话   字段的标签。

     

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

不,它效率不高,因为整个XML文档将被遍历多次以找到特定的对象类型节点。

  

过于复杂?

没有

  

问题B :这个模型看起来是对的还是我错过了一些重要的东西   这将被证明是一个障碍   未来?

模型一般都可以。

  

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

many examples基于密钥的高效查找 - 即使在SO。另请参阅this one

答案 1 :(得分:0)

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

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

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