我们正在构建一个从数据库获取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>
这是改进吗?
答案 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函数。这有多个优点