2010-11-16 53 views
1

我们正在构建一个系统,它从数据库中获取XML数据,使用XSLT将其转换为XHTML,同时使用外部XML文件检索特定于文化的标签( 我们的标签翻译)。用于特定文化文本的外部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文件中有类似映射技术的理论/例子吗?


月2日更新复合键的使用

关键

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

这是一个改进?

+0

这个问题问得好,+1所提供的functionaity /工具。请参阅我的回复,了解所有问题的具体答案,并指出有效实施的示例。 – 2010-11-16 02:22:16

回答

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:没有这种模式似乎是正确还是我失去了一些东西重要 ,这将被证明是 未来的障碍是什么?

该模型一般可以。

问题Ç:是否有类似的映射 技术外部XML文件的任何理论/例子吗?

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

+0

@Dimitre,感谢您的指点和链接。我认为我理解了关键概念,但看到大多数用途都是属性搜索,而我的节点名是基于节点名(* 2级深*)。 [此方法](http://pastebin.com/yA1ryLaQ)是否有所改进? – 2010-11-16 09:46:25

+0

@Gaby:键值只是一个字符串。它可以从属性,节点名称...任何其他字符串或连接构建而成。 – 2010-11-16 13:41:24

+0

@Dimitre:+1非常好的解释。 – 2010-11-16 13:41:43

0

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

另一种方法是从XSLT调用Java函数(看here)或C#(看here。这有多重优势

  • 充分利用这些语言
  • 同捆/翻译文件可以共享
+0

+1,感谢您的链接。第一个不错的概念,但我更愿意尽可能将它保持为不可知的,所以我避免直接​​使用变量,这会被覆盖。我的结构更深入一点。 – 2010-11-16 10:08:15