[英]Replace text in XSL with conditional statements
我正在使用由数码摄像机生成的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。
在我看来,“何时”条件语句是正确的方法,但是我对导致这种情况发生的语法不甚了解。 XML文件中还有其他值需要替换,但是以上是我的使命的一个很好的例子。
您可以做的就是利用模板匹配,将异常与您要更改的内容进行匹配。 首先,将以下模板添加到您的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”匹配。 如果没有匹配项,则将执行默认行为,即仅按原样输出文本值。
我将使用数据驱动的方法。 有一个提供所有翻译的映射文件:
<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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.