2012-06-29 6 views
3

У меня есть XML-файл:XSLT преобразования

<?xml version="1.0" encoding="utf-8"?> 
<Batch BatchID="896" BatchName="20120629.130504"> 
    <Document DocumentType="XML Question"> 
     <Fields> 
      <Field FieldName="Doc_ID">1</Field> 
      <Field FieldName="Vendor_Code">126400</Field> 
      <Field FieldName="Property_Code">10519</Field> 
      <Field FieldName="Invoice_Num">20509</Field> 
     </Fields><Files /> 
    </Document> 
</Batch> 

и я хочу, чтобы преобразовать его выглядеть, как показано ниже, используя файл XSLT:

<?xml version="1.0" standalone="yes"?> 
<ABCRelease> 
    <ABC> 
    <Doc_Id>1345</Doc_Id> 
    <Vendor_Code>134500</Vendor_Code> 
    <Property_Code>105559</Property_Code> 
    <Invoice_Num>2034539</Invoice_Num> 
    </ABC> 
</ABCRelease> 

Мой первый раз играл с XML и I провели много часов, не дожив до сегодняшнего дня, и много искали по этой теме. Кто-нибудь может помочь мне и предоставить образец кода, который бы позволил это сделать?

Моя проблема была в извлечении значения FIELDNAME и вставив его в <> например, от:

<Field FieldName="Doc_ID">1</Field> 

в

<Doc_Id>1345</Doc_Id> 

Действительно бы appreaciate вашей помощи.

Стивен

+0

Будьте осторожны с созданием элементов, основанных на значении атрибута, если атрибут 'FieldName' содержит значение, которое нельзя использовать в качестве имени элемента, например числовое значение или имя с пробелом, преобразование должно быть уловлено это. Если у вас есть полный контроль над используемыми значениями, это не должно вызывать проблем, но это определенно нужно знать. – Flynn1179

ответ

1

Это преобразование:

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

<xsl:template match="Fields"> 
    <ABCRelease> 
    <ABC> 
     <xsl:apply-templates/> 
    </ABC> 
    </ABCRelease> 
</xsl:template> 

<xsl:template match="Field"> 
    <xsl:element name="{@FieldName}"> 
    <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML:

<Batch BatchID="896" BatchName="20120629.130504"> 
    <Document DocumentType="XML Question"> 
     <Fields> 
      <Field FieldName="Doc_ID">1</Field> 
      <Field FieldName="Vendor_Code">126400</Field> 
      <Field FieldName="Property_Code">10519</Field> 
      <Field FieldName="Invoice_Num">20509</Field> 
     </Fields> 
     <Files /> 
    </Document> 
</Batch> 

производит разыскиваемый, правильный результат:

<ABCRelease> 
    <ABC> 
     <Doc_ID>1</Doc_ID> 
     <Vendor_Code>126400</Vendor_Code> 
     <Property_Code>10519</Property_Code> 
     <Invoice_Num>20509</Invoice_Num> 
    </ABC> 
</ABCRelease> 

Объяснение:

Правильное использование <xsl:element> и AVT с (Атрибут Значение шаблонов).

+0

Благодарим за отзыв! Работает с удовольствием – user1490231

+0

@ user1490231: Добро пожаловать. –

+0

Прекрасно работает для OP, но как бы вы адаптировали его, чтобы изящно обрабатывать значения 'FieldName', которые не являются допустимыми именами элементов, например' '2" или "Doc Id"? – Flynn1179

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