2017-01-11 14 views
1

У меня есть XML-преобразования, который имеет переменную год:Создание XML-ключ отличаться в зависимости от условного

<xsl:variable name="rptYearVal" select= "//Reports/Report/year" /> 

и некоторые ключи для поиска значений, которые мне нужно использовать:

<xsl:key name="LUState" match="lookupTypes/LookupState/code" use="@id" /> 
<xsl:key name="LUZip" match="lookupTypes/LookupZipType/code" use="@id" /> 

Теперь у меня есть необходимо указать ключ (в частности, соответствие) на основе переменной года, которую я установил. Так, в течение 2016 года, матч должен быть добавлен узел:

матч = "lookupTypes/lookupData/LookupState/код"

Я думал, что я мог бы использовать условный, например, так:

<xsl:variable name="LookupLocation"> 
     <xsl:choose>  
       <xsl:when test = "$rptYearVal = '2016'"> 
        <xsl:text>lookupTypes/lookupData</xsl:text> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:text>lookupTypes</xsl:text> 
       </xsl:otherwise> 
     </xsl:choose> 
</xsl:variable/> 
<xsl:key name="LUState" match="$LookupLocation/LookupState/code" use="@id" /> 

, но это вызывает ошибку.

Может ли кто-нибудь указать мне правильное направление с помощью этого кода?

+0

Если это не ошибка копирования/вставки, '' определенно является проблемой. Удалите второй '/'. – AJNeufeld

+0

Возможный дубликат [Можно ли использовать переменные внутри xsl: key инструкция?] (Http: // stackoverflow.com/questions/14404408/is-it-possible-to-use-a-variables-inside-xslkey-инструкция) – AJNeufeld

+0

Если вы получаете сообщение об ошибке, отправьте точное сообщение об ошибке. Также укажите, используете ли вы XSLT 1.0 or2.0. –

ответ

1

Существует хорошая техника для достижения динамического определения ключа.

Учитывая этот источник XML документ (как ни один не предусмотрено ОП):

<t> 
<year>2016</year> 
<a> 
    <n id="1">an1</n> 
    <n id="2">an2</n> 
    <n id="3">an3</n> 
    <sub> 
     <n id="1">aSubn1</n> 
     <n id="2">aSubn2</n> 
     <n id="3">aSubn3</n> 
    </sub> 
</a> 
</t> 

и это XSLT 1.0 Преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kInA" match="a/n" use="@id"/> 
<xsl:key name="kInASub" match="a/sub/n" use="@id"/> 

<xsl:variable name="vStylesheet" select="document('')"/> 

<xsl:variable name="vYear" select="/*/year"/> 

    <xsl:template match="/"> 
    <xsl:variable name="vKeyName" select= 
    "$vStylesheet/*/xsl:key[$vYear = 2016 and @name='kInA']/@name 
    | $vStylesheet/*/xsl:key[not($vYear = 2016) and @name='kInASub']/@name "/> 

     <xsl:copy-of select="key($vKeyName, '2')"/> 
    </xsl:template> 
</xsl:stylesheet> 

разыскиваемый результат (за 2016 год) произведено:

<n id="2">an2</n> 

Просто замените <year> элемент в вышеупомянутом документе XML так, что его строковое значение не является «2016» - например, с:

<year>2017</year> 

и запустить преобразование снова производит желаемый результат, на этот раз:

<n id="2">aSubn2</n> 

Что должно быть вашим взятием от этого:

Запомнить:

  1. Можно использовать переменную для первого аргумента функции key()

  2. имя_раздела может Evan быть передан в качестве параметра для любого шаблона (и xsl:function в XSLT 2.0)

+0

Я вижу, что это решение можно использовать. Я «Постараемся это бы также полезно использовать $ vKeyName в этой ситуации ' ' , где вместо того, значение поиска, мне нужно просмотреть значения поиска, и это местоположение поиска будет отличаться в зависимости от года? – Pflipper

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

  • Нет связанных вопросов^_^