【发布时间】: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