2012-07-18 44 views
0

可以說我有以下xml。在轉換之前是否有干預方式來轉換值?

<root> 
    <data> 
    <a>ATTITUDE_ANNOYED</a> 
    <b>ATTITUDE_CAUTIOUS</b> 
    <c>25</c> 
    <d>30</d> 
    </data> 
</root> 

忽略我的輸出的模式,我想我的輸出以呈現爲「謹慎」(一個電平從惱火向上),B爲「 高興」(一個電平從謹慎「向上),我想在C和D上執行一些數學轉換爲稍微不同的值

我已經看了一堆類似的問題在這裏(我是XSLT的新手,所以也許我不太清楚它),但很多解決方案似乎都是「內聯」的,也就是說,當你改變它的結果時,你修改了結果。這沒關係,但是在我的實例中有很多這些值,我不想成爲在多個地方執行完全相同的轉換(DRY),我只想更多或更少的預處理整個文檔,並在開始轉換之前將一組值轉換爲其他值(僅使用幾個公式)。

什麼是最好的方法來實現這一目標?我對性能不是特別感興趣,所以有沒有一種方法可以在不修改結構的情況下運行先前的轉換以輕鬆轉換特定的值?

更新:(DevNull問我的輸出需求)輸出不完全確定。我試圖幫助CivFanatics的一個團隊就其值從xml文件派生而來的AI之間的差異產生指導。有很多領導者和一大堆需要轉化的價值,目前他們每個領導者需要2小時的時間,最終的格式還沒有確定,所以我想我們都會通過使用類似的東西來節省時間XLST。

這是我正在開發的演示的一個粗略示例。

<xsl:template match="data"> 
    <h3>Attitude Thresholds</h3> 
    <table border="1"> 
    <tr><td>Will open borders</td><td><xsl:value-of select="a"/></td></tr> 
    <tr><td>Will trade techs</td><td><xsl:value-of select="b"/></td></tr> 
    </table> 
</xsl:template> 

澄清A和B是OpenBordersRefuseAttitudeThreshold和TechRefuseAttitudeThreshold。如果這些指針是WillOpenBordersAt和WillTradeTechAt而不是xml文件中的原始值,那麼指南更具可讀性,因此我需要將它們提升爲最終輸出的值。

有已討論額外的轉換:

iWonderConstructRand -> Builds Wonders 

0 -> 0/10 
5 -> 1/10 
10 -> 2/10 
15 -> 3/10 
20 -> 4/10 
25 -> 5/10 
30 -> 6/10 
35 -> 7/10 
40 -> 8/10 
45 -> 9/10 
50 -> 10/10 

所以這是如C或D值它們的範圍0-50,應放入0-10格式的可讀性。這些價值也有相當一部分。

還有一些像「GoodieBaddie」轉換,從0到10不等對此我們希望轉換成類似:

0-3 -> Bad(x) 
4-6 -> Neutral(x) 
7-10 -> Good(x) 

其中(x)爲原始值。 我是否甚至在這裏使用正確的工具來完成這項工作,還是處於邊緣?我認爲XLST是一個很好的選擇,可以讓其他貢獻者不必依賴開發人員對格式/佈局進行更改(因爲xlst更容易編輯,然後說C#或Python)。

+0

您想要的XML輸出的一個實際例子會有很大幫助。 – 2012-07-18 04:07:53

+0

真的嗎?我認爲這個問題與輸出是正交的。 – Quibblesome 2012-07-18 04:09:40

+0

那我一定不明白這個問題。 – 2012-07-18 04:11:55

回答

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:attitudes> 
    <a val="1">ANNOYED</a> 
    <a val="2">CAUTIOUS</a> 
    <a val="3">PLEASED</a> 
</my:attitudes> 

<xsl:variable name="vAttitudes" select="document('')/*/my:attitudes/*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(., 'ATTITUDE_')]/text()"> 
    <xsl:variable name="vVal" select= 
    "$vAttitudes[. = substring-after(current(), '_')]/@val"/> 

    <xsl:value-of select="concat('ATTITUDE_', $vAttitudes[@val = $vVal+1])"/> 
</xsl:template> 

<xsl:template match="*[floor(.) = .]/text()"> 
    <xsl:value-of select="concat(round(. div 5), '/10')"/> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<root> 
    <data> 
     <a>ATTITUDE_ANNOYED</a> 
     <b>ATTITUDE_CAUTIOUS</b> 
     <c>25</c> 
     <d>30</d> 
    </data> 
</root> 

產生想要的,正確的結果:

<root> 
    <data> 
     <a>ATTITUDE_CAUTIOUS</a> 
     <b>ATTITUDE_PLEASED</b> 
     <c>5/10</c> 
     <d>6/10</d> 
    </data> 
</root> 
+0

哇,太棒了。 「* [floor(。)=。/ text()」是熱鬧的厚臉皮。我的真實生活文件包含更多價值的方式,所以我仍然需要解決一些問題,但這對我來說是一個很好的起點!謝謝。 – Quibblesome 2012-07-18 07:01:12

+0

@Quibblesome:不客氣。是的,XPath是一種非常強大的選擇語言 - 這與XSLT模板相結合爲我們提供了出色的轉換語言 - 而不是談論XSLT 2.0/XPath 2.0。 – 2012-07-18 11:54:13

相關問題