2016-12-01 6 views
0

Мне нужно преобразовать входные данные XML-структуры, используя шаблон XSL.Преобразование XML с использованием XSL-шаблона

<?xml version="1.0" encoding="Windows-1252" standalone="no"?> 
<ECG> 
    <R000>4</R000> 
    <R001> 
    <A01>R1 A1 Data</A01> 
    <A02>R1 A2 Data</A02> 
    <A03>R2 A3 Data</A03> 
    </R001> 
    <R002> 
    <A01>R2 A1 Data</A01> 
    <A02>R2 A2 Data</A02> 
    <A03>R2 A3 Data</A03> 
    </R002> 
    <R003> 
    <A01>R3 A1 Data</A01> 
    <A02>R3 A2 Data</A02> 
    <A03>R3 A3 Data</A03> 
    </R003> 
    <R004> 
    <A01>R4 A1 Data</A01> 
    <A02>R4 A2 Data</A02> 
    <A03>R4 A3 Data</A03> 
    </R004> 
</ECG> 

Tag R000 определяет, сколько RXXX регистрирует XML будет содержать. Идея состоит в том, чтобы преобразовать XML, используя XSL, в следующий вывод. В этом случае я применяю его к четырем значениям R000. Идея состоит в том, чтобы использовать случайное число во вводе, поэтому оно будет обрабатывать n регистров. A01, A02, A03 Теги всегда будут присутствовать. Просто номер RXXX является переменной.

<?xml version="1.0" encoding="Windows-1252" standalone="no"?> 
<input> 
    <data> 
    <registry DATA1 = "R1 A1 Data" DATA2 = "R1 A2 Data" DATA3 = "R1 A3 Data"/> 
    <registry DATA1 = "R2 A1 Data" DATA2 = "R2 A2 Data" DATA3 = "R2 A3 Data"/> 
    <registry DATA1 = "R3 A1 Data" DATA2 = "R3 A2 Data" DATA3 = "R3 A3 Data"/> 
    <registry DATA1 = "R4 A1 Data" DATA2 = "R4 A2 Data" DATA3 = "R4 A3 Data"/> 
    </data> 
</input> 

Я попытался следующие XSL:

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

    <xsl:template match="/"> 
    <xsl:element name="input" > 
    <xsl:element name="data" > 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R001/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R001/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R001/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R002/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R002/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R002/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R003/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R003/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R003/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
     <xsl:element name="registry" > 
     <xsl:attribute name="DATA1"> 
      <xsl:value-of select="ECG/R004/A01"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA2"> 
      <xsl:value-of select="ECG/R004/A02"/> 
     </xsl:attribute> 
     <xsl:attribute name="DATA3"> 
      <xsl:value-of select="ECG/R004/A03"/> 
     </xsl:attribute> 
     </xsl:element> 
    </xsl:element> 
    </xsl:element> 

</xsl:template> 


</xsl:stylesheet> 

Я думаю, что это не самый лучший способ сделать это! Потому что будет неизвестно RXXX количество тегов. Есть идеи? Я думал о цикле цикла, но, похоже, это невозможно. Благодаря

+0

Так где именно вы застряли с этим? –

+0

Что вы уже пробовали? –

+0

У меня возникли проблемы с использованием XSL. Думаю, мне нужен цикл for для получения значений RXXX. Я не мог этого сделать! Спасибо –

ответ

0

не могли бы вы сделать просто:

XSL 1,0

<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="/ECG"> 
    <input> 
     <data> 
      <xsl:apply-templates select="*[not(self::R000)][position() &lt;= current()/R000]"/> 
     </data> 
    </input> 
</xsl:template> 

<xsl:template match="*"> 
    <registry DATA1="{A01}" DATA2="{A02}" DATA3="{A03}"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Nice !!! Это оно!!! Не могли бы вы объяснить мне это? –

+0

@SergioDavidRomero Какая часть нуждается в объяснении? Он просто берет список всех элементов, которые являются дочерними элементами ЭКГ, кроме «R000», и отключает его в позиции, указанной в «R000». –

+0

Ницца и ясно! Большое спасибо, вы использовали XQuery? –

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