2015-09-28 7 views
0

Я работаю над проблемой, когда мне нужно добавить атрибут к элементу при определенных условиях. Вот XML, который у меня есть. Когда AdditionalItem элемент имеет непустое Value элемент, мне нужно добавить атрибут действие как таковой:Добавление атрибута через xslt

<AdditionalItems> 
     **<AdditionalItem>** 
      <Keys> 
       <Key>Intake Source</Key> 
      </Keys> 
      <IdentifierDisplay>Intake Source</IdentifierDisplay> 
      <DataType> 
       <type>Enumeration</type> 
       <enumeration> 
        <String>311</String> 
        <String>NIS Inspector</String> 
        <String>Other CCD Agency</String> 
       </enumeration> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <Enumerations> 
        <Enumeration> 
         <Keys> 
          <Key>311</Key> 
         </Keys> 
         <IdentifierDisplay>311</IdentifierDisplay> 
        </Enumeration> 
        <Enumeration> 
         <Keys> 
          <Key>NIS Inspector</Key> 
         </Keys> 
         <IdentifierDisplay>NIS Inspector</IdentifierDisplay> 
        </Enumeration> 
        <Enumeration> 
         <Keys> 
          <Key>Other CCD Agency</Key> 
         </Keys> 
         <IdentifierDisplay>Other CCD Agency</IdentifierDisplay> 
        </Enumeration> 
       </Enumerations> 
       <inputRequired>false</inputRequired> 
       <fieldType>Enumeration</fieldType> 
      </DataType> 
      <Name>Intake Source</Name> 
      **<Value>311</Value>** 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Other CCD Agency</Key> 
      </Keys> 
      <IdentifierDisplay>Other CCD Agency</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Other CCD Agency</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>311 Agent</Key> 
      </Keys> 
      <IdentifierDisplay>311 Agent</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>311 Agent</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Case Number</Key> 
      </Keys> 
      <IdentifierDisplay>Case Number</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Case Number</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Case Created Date</Key> 
      </Keys> 
      <IdentifierDisplay>Case Created Date</IdentifierDisplay> 
      <DataType> 
       <type>Date</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Date</fieldType> 
      </DataType> 
      <Name>Case Created Date</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Complaintant Name:</Key> 
      </Keys> 
      <IdentifierDisplay>Complaintant Name:</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Complaintant Name:</Name> 
      <Value>Fred Fredderson</Value> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Phone Number:</Key> 
      </Keys> 
      <IdentifierDisplay>Phone Number:</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Phone Number:</Name> 
      <Value>3033333333</Value> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Email</Key> 
      </Keys> 
      <IdentifierDisplay>Email</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Email</Name> 
      <Value>[email protected]</Value> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Council District:</Key> 
      </Keys> 
      <IdentifierDisplay>Council District:</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Council District:</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Inspector Distict:</Key> 
      </Keys> 
      <IdentifierDisplay>Inspector Distict:</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Inspector Distict:</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
     <AdditionalItem> 
      <Keys> 
       <Key>Permit Number</Key> 
      </Keys> 
      <IdentifierDisplay>Permit Number</IdentifierDisplay> 
      <DataType> 
       <type>String</type> 
       <inputRange> 
        <maxValue>0.0</maxValue> 
       </inputRange> 
       <inputRequired>false</inputRequired> 
       <fieldType>Text</fieldType> 
      </DataType> 
      <Name>Permit Number</Name> 
      <Value/> 
      <security>F</security> 
      <drillDown>false</drillDown> 
     </AdditionalItem> 
    </AdditionalItems> 

Моя первая мысль была сделать for-each на //AdditionalItem, а затем проверить, чтобы увидеть, если длина элемента Value было> 0. Если это так, добавьте атрибут action. Это похоже на разумный подход? Что-то похожее на это:

<xsl:for-each select="/ns2:UpdateCAP/ns2:AdditionalInformation//AdditionalItem"> 
    <xsl:if test="string-length(Value) > 0"> 
     <!-- somehow add the attribute --> 
    </xsl:if> 
</xsl:for-each> 
+0

Ох - атрибут должен быть:

ответ

1
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

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

    <xsl:template match="AdditionalItem[Value[text()]]"> 
     <xsl:copy> 
      <xsl:attribute name="action">Add</xsl:attribute> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Мы не можем изменить существующий документ XML с помощью XSLT. Нам нужно скопировать все элементы, добавив атрибут в нужное место.
Итак, мы копируем все узлы и атрибуты с помощью первого шаблона и копируем узел дополнительного пользователя, содержащий непустой внутренний узел Value, добавляя атрибут с использованием второго шаблона.

AdditionalItem соответствует узлу с именем AdditionalItem.
AdditionalItem[Value] соответствует узлу с именем AdditionalItem и внутренним узлом с именем Значение, имеющее любой контент (может быть пустым).
AdditionalItem[Value[text()]] соответствует узлу с именем AdditionalItem и внутренним узлом с именем Значение, имеющее некоторый контент (непустой).

+0

Большое спасибо Alexander! Отлично работает. Можете ли вы объяснить, что делает каждая из частей? –

+0

@MichaelLove - обновление. Извините, мой английский оставляет желать лучшего. –

+0

Это было отличное описание. Большое спасибо за Вашу помощь. –

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