我正在使用由数码摄像机生成的XML文件。相机允许用户将所有相机的设置保存到SD卡,以便可以调用设置或将其加载到另一台相机中。我正在编写的XSL样式表将允许用户查看相机的设置,并在Web浏览器中保存到SD卡。
虽然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 :(得分: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”。当没有匹配时,默认行为将会启动,这将只是按原样输出文本值。
答案 1 :(得分:0)
我会使用数据驱动的方法。有一个映射文件,提供所有翻译:
<translations>
<translate from="Rec_log" to="LogC"/>
<translate .../>
</translations>
然后定义一个键:
<xsl:key name="trans" match="translate" use="@from"/>
然后更改
<xsl:value-of select="Settings/Groups/Recording/DteLut"/>
到
<xsl:value-of select="key('trans', Settings/Groups/Recording/DteLut,
doc('translations.xml'))/@to"/>
如果使用XSLT 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。