2013-10-04 3 views
0

Я новичок в трансформации XSL, так может быть его основной вопрос, я должен преобразовать следующий XML-фрагмент в другой формат XML (листинг 2)сотрудничать XML-теги с помощью XSLT

Листинг 1:

<arr name="experimental-properties-kind"> 
     <str>Hydrophobicity</str> 
     <str>Isoelectric Point</str> 
     <str>Molecular Weight</str> 
     <str>Molecular Formula</str> 
    </arr> 
    <arr name="experimental-properties-value"> 
     <str>-0.985</str> 
     <str>3.91</str> 
     <str>2180.2853</str> 
     <str>C287H440N80O110S6</str> 
    </arr> 
    <arr name="experimental-properties-source"> 
     <str>Otto, A. Seckler, R. Eur. J. Biochem. 202:67-73 (1991)</str> 
     <str/> 
     <str/> 
     <str/> 
    </arr> 

Листинг 2:

<experimental-properties> 
    <property> 
    <kind>Hydrophobicity</kind> 
    <value>-0.985</value> 
    <source></source> 
    </property> 
    <property> 
    <kind>Isoelectric Point</kind> 
    <value>3.91</value> 
    <source></source> 
    </property> 
    <property> 
    <kind>Molecular Weight</kind> 
    <value>2180.2853</value> 
    <source></source> 
    </property> 
    <property> 
    <kind>Molecular Formula</kind> 
    <value>C98H138N24O33</value> 
    <source></source> 
    </property> 
</experimental-properties> 

Также, пожалуйста, мне предложить инструмент для отладки XSLT. Спасибо заранее!

+0

Что вы пробовали в XSL? Можете ли вы обновить свой вопрос тем, что вы пробовали, и почему он не работает? –

+0

Я предоставил XSLT, чтобы вы могли узнать из моего ответа ниже, но имейте в виду, что рекомендации по инструменту недоступны для переполнения стека. – kjhughes

ответ

0

Ваш вклад XML-, изменен, чтобы иметь единственный корневой элемент, как требуется, чтобы быть хорошо сформированы:

<arrs-triplet> 
    <arr name="experimental-properties-kind"> 
    <str>Hydrophobicity</str> 
    <str>Isoelectric Point</str> 
    <str>Molecular Weight</str> 
    <str>Molecular Formula</str> 
    </arr> 
    <arr name="experimental-properties-value"> 
    <str>-0.985</str> 
    <str>3.91</str> 
    <str>2180.2853</str> 
    <str>C287H440N80O110S6</str> 
    </arr> 
    <arr name="experimental-properties-source"> 
    <str>Otto, A. Seckler, R. Eur. J. Biochem. 202:67-73 (1991)</str> 
    <str/> 
    <str/> 
    <str/> 
    </arr> 
</arrs-triplet> 

Преобразованный этого XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/arrs-triplet"> 
    <experimental-properties> 
     <xsl:for-each select="arr[@name = 'experimental-properties-kind']/str"> 
     <xsl:variable name="kind-position" select="position()"/> 
     <property> 
      <kind><xsl:value-of select="."/></kind> 
      <value><xsl:value-of select="../../arr[@name='experimental-properties-value']/str[position() = $kind-position]"/></value> 
      <source><xsl:value-of select="../../arr[@name='experimental-properties-source']/str[position() = $kind-position]"/></source> 
     </property> 
     </xsl:for-each> 
    </experimental-properties> 
    </xsl:template> 
</xsl:stylesheet> 

дает требуемый выход XML:

<?xml version="1.0" encoding="UTF-8"?> 
<experimental-properties> 
    <property> 
     <kind>Hydrophobicity</kind> 
     <value>-0.985</value> 
     <source>Otto, A. Seckler, R. Eur. J. Biochem. 202:67-73 (1991)</source> 
    </property> 
    <property> 
     <kind>Isoelectric Point</kind> 
     <value>3.91</value> 
     <source/> 
    </property> 
    <property> 
     <kind>Molecular Weight</kind> 
     <value>2180.2853</value> 
     <source/> 
    </property> 
    <property> 
     <kind>Molecular Formula</kind> 
     <value>C287H440N80O110S6</value> 
     <source/> 
    </property> 
</experimental-properties> 

Обратите внимание, что я допустил предоставление содержимого элемента source, даже если он не указан в вашем примере вывода.

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