XSLT重新格式化XML文档

时间:2012-03-15 14:45:01

标签: xml xslt

我希望制作一个XSLT来转换下面的输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<payload>
    <header>
        <from>From: exmaple@domain.com</from>
        <to>To: exmaple@domain.com</to>
    </header>

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

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

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

    </attachments>
</payload>

成:

From: exmaple@domain.com
To: exmaple@domain.com

Hello, email body here...

To: exmaple@domain.com
log1


To: exmaple@domain.com
log2

每次附件后重复To节点的位置。可以有很多附件,而不仅仅是两个。

从用户更新

我对此很新,但我尝试创建没有标题,电子邮件和附件标记的有效负载。然后习惯将它们排列成正确的顺序,但这看起来很糟糕。而且不可扩展

1 个答案:

答案 0 :(得分: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>