2013-05-07 3 views
0

У меня есть XML-файл, для которого правила трансформации должны применяться для определенных элементов только на основе его значения атрибута, а остальные должны сохраняться как есть.XSL Трансформация только для определенного элемента на основе атрибутов

<bigdata> 
<data> 
    <Object class="QWE" Name="Country-1/State-1/QWE-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
</data> 

выше XML должен быть преобразован в XML ниже фрагмента, где только XML-элемент Объект, для которого класса равен QWE должен быть изменен на POST. , т. Е. Только первый элемент должен быть изменен в зависимости от его атрибута. Любые советы по этому вопросу будет благодарны

<bigdata> 
<data> 
    <Object class="POST" Name="Country-1/State-1/POST-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
    <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
     <p name="Map">20</p> 
     <p name="Required">0</p> 
     <p name="Combined">68</p> 
     <p name="State">0</p> 
    </Object> 
</data> 

ответ

0

Используйте следующие XSLT для преобразования выше XML:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@class[parent::Object]"> 
    <xsl:choose> 
     <xsl:when test=".='QWE'"> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="'POST'"/> 
     </xsl:attribute> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:attribute name="class"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
     </xsl:otherwise> 
    </xsl:choose> 

    </xsl:template> 

см это для получения дополнительной информации:

XSLT: How to change an attribute value during <xsl:copy>?

+0

Что следует делать, если class = "QWE-1", и i должен сохранять "-1" выше. Новое значение было бы class = "POST-1" – user1529282

1

Try это:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

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

    <xsl:template match="Object/@class[. = 'QWE' ]"> 
      <xsl:attribute name="class"> 
       <xsl:value-of select="'POST'"/> 
      </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

Какой будет генерировать следующий вывод:

<bigdata> 
     <data> 
       <Object class="POST" Name="Country-1/State-1/QWE-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="RTY" Name="Country-1/State-1/RTY-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="UIO" Name="Country-1/State-1/UIO-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
       <Object class="PAS" Name="Country-1/State-1/PAS-1"> 
         <p name="Map">20</p> 
         <p name="Required">0</p> 
         <p name="Combined">68</p> 
         <p name="State">0</p> 
       </Object> 
     </data> 
</bigdata> 

Update, если значение класса следует начать со строкой (Qwe) и только эта часть должна быть заменена. Попробуйте следующее:

<xsl:template match="Object/@class[starts-with(., 'QWE') ]"> 
    <xsl:attribute name="class"> 
     <xsl:value-of select="'POST'"/> 
     <xsl:value-of select="substring-after(.,'QWE')"/> 
    </xsl:attribute> 
</xsl:template> 
+0

Что делать, если class = "QWE-1", и я должен сохранить «-1» выше. Новое значение будет class = "POST-1" – user1529282

+0

. Посмотрите на обновление. –

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

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