2013-07-10 77 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明白,如果播出狀態的值將被取消,應該只更新電視節目名稱值元素。

請幫我一直堅持這個好幾個小時!!!!

+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元素,其nameTV Show Name。它生成一個value元素,並將其文本設置爲所需的字符串,具體取決於相同<content>塊中的Airing Status的值。

注意:如果' 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> 
相關問題