2010-11-16 50 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