2013-07-10 4 views
0

Долгое время этого сайта без регистрации. Теперь я нашел проблему, которая, хотя я уверен, что ее просто решить, я не вижу никакого релевантного материала ни в одном из моих поисков!Попытка обновить значение одного элемента xml на основе значения другого

Мой вопрос упрощена с этим XML, например:

<root_element> 
<content> 
    <content-detail> 
    <name>TV Show Name</name> 
    <value> Father Ted </value> 
    </content-detail> 

    <content-detail> 
    <name>Airing Status</name> 
    <value> Cancelled </value> 
    </content-detail> 

</content> 
</root_element> 

в этом полностью вымышленном примере, позволяет предположим, что я хотел написать преобразование XSL, что бы обновить Отец Тед «Отец Тед - ОТМЕНЕН».

Я могу обновить все названия ТВ-шоу, но у меня возникли проблемы с получением XSL, чтобы понять, что он должен обновлять только элемент отображения TV Show Name, если значение статуса аэрации отменено.

Пожалуйста, помогите, я застрял на этом в течение нескольких часов !!!!

+0

Покажите нам, что вы пробовали. – Sumurai8

ответ

0

Это будет делать то, что вы хотите

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="value[../name='TV Show Name']"> 
     <value> 
      <xsl:choose> 
       <xsl:when test="../../content-detail[name='Airing Status']/value = ' Cancelled '"> 
        <xsl:value-of select="."/>- Cancelled 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="."/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </value> 
    </xsl:template>  
</xsl:stylesheet> 

Первый шаблон является «тождественное преобразование», который просто копирует вход на выход.

Второй шаблон соответствует только value элементам, name является TV Show Name. Он производит элемент value с текстом, установленным в нужную строку, в зависимости от значения Airing Status в том же блоке <content>.

Примечание. Возможно, вам придется отрегулировать тесты, если есть какие-либо отклонения в пробеле вокруг значения ' Cancelled '.

0

Вот решение, которое является пуш-ориентированным, является немного более простым с точки зрения шаблонов матчей, и работает с любым количеством пробелов вокруг ваших значений:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output omit-xml-declaration="no" indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template 
    match="content[content-detail 
      [normalize-space(name) = 'Airing Status'] 
      [normalize-space(value) = 'Cancelled'] 
      ] 
      /content-detail[normalize-space(name) = 'TV Show Name']/value"> 
    <value> 
     <xsl:value-of select="concat(normalize-space(), ' -- CANCELLED')"/> 
    </value> 
    </xsl:template> 

</xsl:stylesheet> 
Смежные вопросы