2012-06-19 8 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.

Мне кажется, что условное утверждение «когда» является правильным, но я недостаточно знаком с синтаксисом, чтобы это произошло. В 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». Когда нет совпадения, по умолчанию будет выполняться по умолчанию, в котором будет просто выводиться текстовое значение as-is.

+0

Он отлично работает! Спасибо! Теперь я предполагаю, что я делаю то же самое для любого текста, который хочу заменить. – JosephThomas

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.

+0

Спасибо! Прежде чем я прочитал ваше решение, я попробовал первый ответ, который я получил, который работал. Я оставлю это на заднем плане. – JosephThomas

Смежные вопросы