Преобразование XSLT — динамические имена элементов

#xml #xslt #dynamic

#xml #xslt #динамический

Вопрос:

Ввод источника

 <SiebelMessage MessageId="1-18J35" IntObjectName="XRX R5 Letter Instance"  MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">
<LetterInstance  Id="1-1RUYIF" Language="ENU" TemplateType="SA">
<Field  Value="CO Last Name"  Datatype="String" Name="ContractingOfficerLastName">
</LetterInstance>
</SiebelMessage>
 

Ожидаемый результат:

 <?xml version="1.0" encoding="UTF-8"?>
<SiebelMessage MessageId="1-18J35" IntObjectName="XRX R5 Letter Instance" MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">
<LetterInstance  Id="1-1RUYIF" Language="ENU" TemplateType="SA">
<ContractingOfficerLastName>CO Last Name</ContractingOfficerLastName>
<PONumber>POTest000001</PONumber>
</LetterInstance>
</SiebelMessage>
 

В основном получаем значение атрибута Name элемента Field и создаем новый элемент, а затем получаем значение атрибута «Value» и используем его как значение нового элемента.

Комментарии:

1. Откуда <PONumber> берется? Кроме того, ваш Field элемент во входных данных неправильно сформирован.

Ответ №1:

Эта таблица стилей XSL:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="Field">
    <xsl:element name="{@Name}">
      <xsl:value-of select="@Value"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>
 

Применяется к правильно сформированным входным данным:

 <SiebelMessage MessageId="1-18J35" IntObjectName="XRX R5 Letter Instance"  MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">
  <LetterInstance  Id="1-1RUYIF" Language="ENU" TemplateType="SA">
    <Field  Value="CO Last Name"  Datatype="String" Name="ContractingOfficerLastName"/>
  </LetterInstance>
</SiebelMessage>
 

Производит:

 <SiebelMessage MessageId="1-18J35" IntObjectName="XRX R5 Letter Instance" MessageType="Integration Object" IntObjectFormat="Siebel Hierarchical">
   <LetterInstance Id="1-1RUYIF" Language="ENU" TemplateType="SA">
      <ContractingOfficerLastName>CO Last Name</ContractingOfficerLastName>
   </LetterInstance>
</SiebelMessage>
 

Я не уверен, откуда <PONumber> должно быть сгенерировано.

Комментарии:

1. Решение сработало как шарм. Я перепутал исходный и целевой ввод при попытке скопировать вставить в окно … не могу отблагодарить вас за это…

Ответ №2:

Что-то в этом роде, если я вас правильно понимаю:

 <xsl:element name="name()">
 <xsl:value-of select="./text()" />
</xsl:element>