2012-06-19 50 views
1

我正在處理由數字攝像機生成的XML文件。相機允許用戶將所有相機的設置保存到SD卡上,以便設置可以被調用或加載到另一個相機中。我寫的XSL樣式表將允許用戶查看相機的設置,並保存到網絡瀏覽器中的SD卡中。用條件語句替換XSL中的文本

儘管XML文件中的大部分值(如我的樣式表格式)對人類有意義,但有些則不然。我想要做的是讓樣式表顯示基於XML文件中的值的文本,但更容易被人理解。

我的示例XML文件可以在這裏看到:http://josephthomas.info/Alexa/Setup_120511_140322.xml

幾行下來的頁面,你會看到:

Color GAMMA-SxS Rec_Log 

雖然「Rec_Log」是一個值,該相機明白,它不是相機的用戶將理解的價值。我想讓樣式表做的是顯示「LogC」。

在XML文件中這個值正是如此定義:

<DteLut lowerLimit="0" upperLimit="2">Rec_Log</DteLut> 

的XSL格式的樣本頁面這個值是:

<tr> 
    <td class="title_column">Color GAMMA-SxS</td><td><xsl:value-of select="Settings/Groups/Recording/DteLut"/> 
    </td> 
</tr> 

所以我希望做的是有「LogC」顯示在頁面上而不是Rec_Log。

在我看來,「when」條件語句是正確的方法,但我不熟悉語法導致這種情況發生。在XML文件中還有其他值需要替換,但上面是我的使命的一個很好的例子。

回答

0

你可以做的是利用模板匹配,使異常與你想改變的內容匹配。首先,下面的模板添加到您的XSL

<xsl:template match="DteLut[. = 'Rec_Log']"> 
    <xsl:text>LogC</xsl:text> 
</xsl:template> 

然後,而不是下面的行

<xsl:value-of select="Settings/Groups/Recording/DteLut"/> 

執行以下行

<xsl:apply-templates select="Settings/Groups/Recording/DteLut"/> 

當* DteLut的價值*是「Rec_Log」,那麼自定義模板將被匹配以輸出「LogC」。當沒有匹配時,默認行爲將會啓動,直接輸出文本值。

+0

它完美的作品!謝謝! 現在我假設我對要替換的任何文本都做同樣的事情。 – JosephThomas

0

我會使用數據驅動的方法。有一個映射文件,讓所有翻譯:

<translations> 
    <translate from="Rec_log" to="LogC"/> 
    <translate .../> 
</translations> 

然後定義鍵:

<xsl:key name="trans" match="translate" use="@from"/> 

,然後,如果使用XSLT改變

<xsl:value-of select="Settings/Groups/Recording/DteLut"/> 

<xsl:value-of select="key('trans', Settings/Groups/Recording/DteLut, 
          doc('translations.xml'))/@to"/> 

2.0或

<xsl:variable name="val" select="Settings/Groups/Recording/DteLut"/> 
<xsl:for-each select="document('translations.xml')"> 
    <xsl:value-of select="key('trans', $val)/@to"/> 
</xsl:for-each> 

如果你堅持使用1.0。

+0

謝謝!在我閱讀你的解決方案之前,我嘗試了我得到的第一個答案,其中有效。我會保留這一個在後面的燃燒器。 – JosephThomas