2015-10-19 3 views
0

Есть ли способ изменить XML, изменив или добавив атрибут, основанный на значении узлов/дочерних значений узлов?Как изменить или добавить атрибут XML с помощью XSLT на основе значения sibligs узла xml?

Мне нужно преобразовать:

<FieldMatchResult FieldName="Record_Amount"> 

в одно из следующих действий:

<FieldMatchResult FieldName="Record_1_Amount"> 

или

<FieldMatchResult FieldName="Record_Amount" Tag="Record_1_Amount"> 

Вот мой пример, и мне нужно, чтобы вытащить значение из " Row Index "

<?xml version="1.0"?> 
<ArtifactMatchResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
    <SubArtifacts> 
    <ArtifactMatchResult ArtifactName="Data Record"> 
     <Fields> 
     <FieldMatchResult FieldName="Record_Amount"> 
      <Values> 
      <anyType xsi:type="xsd:double">123456.5</anyType> 
      </Values> 
     </FieldMatchResult> 
     <FieldMatchResult FieldName="Record_Rate" > 
      <Values> 
      <anyType xsi:type="xsd:double">1.25</anyType> 
      </Values> 
     </FieldMatchResult> 
     <FieldMatchResult FieldName="Row Index"> 
      <Values> 
      <anyType xsi:type="xsd:double">1</anyType> 
      </Values> 
     </FieldMatchResult> 
     </Fields> 
     <SubArtifacts /> 
    </ArtifactMatchResult> 
    <ArtifactMatchResult ArtifactName="Data Record"> 
     <Fields> 
     <FieldMatchResult FieldName="Record_Amount"> 
      <Values> 
      <anyType xsi:type="xsd:double">123456.5</anyType> 
      </Values> 
     </FieldMatchResult> 
     <FieldMatchResult FieldName="Record_Rate" > 
      <Values> 
      <anyType xsi:type="xsd:double">1.25</anyType> 
      </Values> 
     </FieldMatchResult> 
     <FieldMatchResult FieldName="Row Index"> 
      <Values> 
      <anyType xsi:type="xsd:double">2</anyType> 
      </Values> 
     </FieldMatchResult> 
    </Fields> 
     <SubArtifacts /> 
    </ArtifactMatchResult> 
    </SubArtifacts> 
</ArtifactMatchResult> 

Большое спасибо за любые указатели.

+0

Что именно вы имеете в виду под "* на основе узлов братьев и сестер/ребенок значение *"? Пожалуйста, укажите четкие критерии: если это, то это, иначе что-то еще. –

ответ

2

Используйте следующую-родственный axis со следующим шаблоном:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="XML" omit-xml-declaration="yes"/> 
    <xsl:template match="ArtifactMatchResult/SubArtifacts/ArtifactMatchResult/Fields"> 
    <FieldMatchResult FieldName="Record_Amount"> 
     <xsl:attribute name="Tag"> 
     <xsl:value-of select="concat('Record_', */following-sibling::FieldMatchResult[@FieldName = 'Row Index']/Values/anyType, '_Amount')" /> 
     </xsl:attribute> 
    </FieldMatchResult> 
    </xsl:template> 
</xsl:stylesheet> 
  • concat() конкатенации двух или более строк, разделенных запятой.
  • * выбирает всех дочерних узлов контекстного узла.
  • following-sibling::FieldMatchResult выбирает все узлы братьев и сестер, которые следуют за дочерними узлами контекстного узла.
  • [@FieldName = 'Row Index'] выбирает все узлы, у которых есть атрибут FieldName значения «Индекс строк».

Этот XSLT, примененной к вашему XML, дает следующий результат:

<FieldMatchResult FieldName="Record_Amount" Tag="Record_1_Amount"/> 
    <FieldMatchResult FieldName="Record_Amount" Tag="Record_2_Amount"/> 
+0

Я расскажу об этом позже на этой неделе благодарит за описание – Marek

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