1

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

4

2 回答 2

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”。当没有匹配时,默认行为将启动,即按原样输出文本值。

于 2012-06-19T11:17:01.953 回答
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.

于 2012-06-19T11:24:29.287 回答