用条件语句替换XSL中的文本

时间:2012-06-19 10:20:32

标签: xslt

我正在使用由数码摄像机生成的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文件中还有其他值需要替换,但上面是我的使命的一个很好的例子。

2 个答案:

答案 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。