2012-03-15 4 views
1

Я ищу, чтобы сделать XSLT, который преобразует входной XML ниже:XSLT переформатировать XML Document

<?xml version="1.0" encoding="UTF-8"?> 
<payload> 
    <header> 
     <from>From: [email protected]</from> 
     <to>To: [email protected]</to> 
    </header> 

    <email> 
     <body>Hello, email body here...</body> 
    </email> 

    <attachments> 
     <attachment> 
      <name>log1</name> 
     </attachment> 

     <attachment> 
      <name>log2</name> 
     </attachment> 

    </attachments> 
</payload> 

в:

From: [email protected] 
To: [email protected] 

Hello, email body here... 

To: [email protected] 
log1 


To: [email protected] 
log2 

Если к узлу повторяется после каждого вложения. Там может быть несколько вложений, а не только два.

ОБНОВЛЕНИЕ ОТ ПОЛЬЗОВАТЕЛЯ

Im довольно нового для этого, но я попытался создать полезную нагрузку без тегов заголовка, электронной почты и вложений. Затем используется, чтобы упорядочить их в правильном порядке, но это выглядит ужасно. И не является масштабируемым

+1

Что вы пробовали? http://mattgemmell.com/2008/12/08/what-have-you-tried/ SO - это не место, которое нужно сделать, чтобы избежать тяжелой работы. –

+0

Im довольно новичок в этом, но я попытался создать полезную нагрузку без тэгов 'header',' email' и 'attachment'. Затем используйте '', чтобы упорядочить их в правильном порядке, но это выглядит ужасно. И не масштабируется – MMKD

ответ

2

Как насчет:

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

    <xsl:output method="text"/> 

    <xsl:template match="from|to"> 
    <xsl:value-of select="text()"/> 
    <xsl:text>&#0010;</xsl:text> 
    </xsl:template> 

    <xsl:template match="body"> 
    <xsl:text>&#0010;</xsl:text> 
    <xsl:value-of select="text()"/> 
    <xsl:text>&#0010;</xsl:text> 
    </xsl:template> 

    <xsl:template match="attachments"> 
    <xsl:for-each select="attachment"> 
     <xsl:text>&#0010;&#0010;</xsl:text> 
     <xsl:apply-templates select="../../header/to"/> 
     <xsl:value-of select="name/text()"/> 
     <xsl:text>&#0010;</xsl:text> 
    </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="text()"/> 

</xsl:stylesheet> 
Смежные вопросы