2014-06-22 3 views
-2

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

<?xml version="1.0" encoding="UTF-8"?> 
<RDATE date="2014-03-14"> 
    <STUDENT id="A-001" sex="M" group_a="yellow" group_b="green"> 
     <NAME id="A-001-1" STUDENT_id="A-001" group="yellow"> 
      <L_NAME>Yuvraj</L_NAME> 
      <M_NAME/> 
      <F_NAME>Bhatia</F_NAME> 
      <O_NAME/> 
      <AGE>15</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
     <ORIGIN id="A-001-A-O" region="Asia"> 
      <BIRTH>1999-01-01</BIRTH> 
      <PLACE>Mumbai</PLACE> 
     </ORIGIN> 
     <IDENT id="A-001-A-O-I" type="paper/photo"> 
      <PASSPORT/> 
      <COUNTRY/> 
     </IDENT> 
    </STUDENT> 
    <STUDENT id="A-002" sex="F" group_a="green" group_b="blue"> 
     <NAME id="A-002-1" STUDENT_id="A-002" group="green"> 
      <L_NAME>Singh</L_NAME> 
      <M_NAME/> 
      <F_NAME>Palwinder</F_NAME> 
      <O_NAME>Palwinder Singh</O_NAME> 
      <AGE>19</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
     <NAME id="A-002-2" STUDENT_id="A-002" group="green"> 
      <L_NAME>Singh</L_NAME> 
      <M_NAME>Balwant</M_NAME> 
      <F_NAME>Palwinder</F_NAME> 
      <O_NAME>Balwant Singh</O_NAME> 
      <AGE>19</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
    </STUDENT> 
</RDATE> 

Который дает мне следующий вывод:

<?xml version="1.0" encoding="utf-8"?><RDATE><date>2014-03-14</date> 
    <STUDENT><id>A-001</id><sex>M</sex><group_a>yellow</group_a><group_b>green</group_b> 
     <NAME><id>A-001-1</id><STUDENT_id>A-001</STUDENT_id><group>yellow</group> 
      <L_NAME>Yuvraj</L_NAME> 
      <M_NAME/> 
      <F_NAME>Bhatia</F_NAME> 
      <O_NAME/> 
      <AGE>15</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
     <ORIGIN><id>A-001-A-O</id><region>Asia</region> 
      <BIRTH>1999-01-01</BIRTH> 
      <PLACE>Mumbai</PLACE> 
     </ORIGIN> 
     <IDENT><id>A-001-A-O-I</id><type>paper/photo</type> 
      <PASSPORT/> 
      <COUNTRY/> 
     </IDENT> 
    </STUDENT> 
    <STUDENT><id>A-002</id><sex>F</sex><group_a>green</group_a><group_b>blue</group_b> 
     <NAME><id>A-002-1</id><STUDENT_id>A-002</STUDENT_id><group>green</group> 
      <L_NAME>Singh</L_NAME> 
      <M_NAME/> 
      <F_NAME>Palwinder</F_NAME> 
      <O_NAME>Palwinder Singh</O_NAME> 
      <AGE>19</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
     <NAME><id>A-002-2</id><STUDENT_id>A-002</STUDENT_id><group>green</group> 
      <L_NAME>Singh</L_NAME> 
      <M_NAME>Balwant</M_NAME> 
      <F_NAME>Palwinder</F_NAME> 
      <O_NAME>Balwant Singh</O_NAME> 
      <AGE>19</AGE> 
      <ETHNICITY>Asian</ETHNICITY> 
     </NAME> 
    </STUDENT> 
</RDATE> 

При трансформируются с помощью следующей XSLT:

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

    <xsl:template match="*"> 
    <xsl:element name="{name()}"> 
     <xsl:for-each select="@*"> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
     </xsl:for-each> 
     <xsl:apply-templates select="*|text()"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Но я с нетерпением жду следующего выхода:

<?xml version="1.0" encoding="UTF-8"?> 
<DATA> 
    <STUDENTS> 
     <STUDENT> 
      <UNIQUE-ID>A-001</UNIQUE-ID> 
      <GENDER>Male</GENDER> 
      <NAME_A>Bhatia</NAME_A> 
      <NAME_B/> 
      <NAME_C>Yuvraj</NAME_C> 
      <COMMENTS> 
       <GROUP_A>Yellow</GROUP_A> 
       <GROUP_B>Green</GROUP_B> 
       <STUDENT_id>A-001</STUDENT_id> 
       <IDENT_id>A-001-A-O-I</IDENT_id> 
       <IDENT_type>paper/photo</IDENT_type> 
      </COMMENTS> 
      <BORN> 
       <DATE> 
        <A>1999-01-01</A> 
       </DATE> 
      </BORN> 
      <IDENTS> 
       <IDENT> 
        <PASSPORT/> 
        <COUNTRY/> 
       </IDENT> 
      </IDENTS> 
     </STUDENT> 
    </STUDENTS> 
</DATA> 

Что следует отметить, что:

  • Мой XML имеет более 5000 уникальных студентов.
  • Каждый студент может иметь одно или несколько атрибутов/элементов «НАЗВАНИЕ» (как показано на втором ученике) вместе со своими соответствующими элементами.
  • Каждый ученик может иметь один или несколько атрибутов «ORIGIN»/элементов вместе со своими соответствующими элементами.
  • Каждый ученик может иметь один или несколько атрибутов/элементов «IDENT» вместе со своими соответствующими элементами.
  • Дополнительные атрибуты могут быть или не быть в исходном XML. Все это должно быть включено в элемент «КОММЕНТАРИИ» после преобразования.

ответ

1

Я не уверен, что именно вы здесь испытываете: это похоже на упражнение в базовом XSLT. Вам просто нужно получить гораздо более явный (и подробный). Смотрите, если это может заставить вас начать:

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

<xsl:template match="/"> 
    <DATA> 
     <STUDENTS> 
      <xsl:apply-templates select="RDATE/STUDENT"/> 
     </STUDENTS> 
    </DATA> 
</xsl:template> 

<xsl:template match="STUDENT"> 
    <STUDENT> 
     <UNIQUE-ID><xsl:value-of select="@id"/></UNIQUE-ID> 
     <GENDER> 
      <xsl:choose> 
       <xsl:when test="@sex='M'">Male</xsl:when> 
       <xsl:otherwise>Female</xsl:otherwise> 
      </xsl:choose> 
     </GENDER> 

     <!-- and so on ... --> 

    </STUDENT> 
</xsl:template> 

</xsl:stylesheet> 
+0

спасибо, но при условии, преобразование не удается достичь, как если приглядеться определенные атрибуты (сущность/group_a и сущность/group_b) будут гибнуть комментарии как отдельные элементы, в то время как, атрибуты из элемента «name» (F_NAME/M_NAME/L_NAME/O_NAME) после преобразования преобразуется в отдельные элементы (NAME_A/NAME_B/NAME_C). Я новичок в XML/XSLT и мало или совсем не испытываю таких преобразований. Просьба посоветуйте ... –

+0

@ReggieMiller Как я уже сказал, это только отправная точка. SO не является кодирующей услугой. Если у вас есть ** конкретный ** вопрос, вы можете спросить его, но не ожидайте, что работа будет выполнена для вас. –

+0

Я никогда не просил написать весь код. Просто нужно руководство или предложения. Конкретно, можете ли вы рассказать мне, как объединить/слить атрибуты из нескольких элементов ввода (STUDENT-> NAME/ORIGIN/IDENT) и поместить их под один элемент (КОММЕНТАРИИ) после преобразования? –

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