我需要将消息数据从一种格式转换为另一种格式。原始文件有 3472 个条目(短信/短信)。id,threadId,person将不再需要。但我必须创造@time,@name。
我拥有的格式:
<?xml version='1.0' encoding='UTF-8'?>
<smsall>
<sms>
<id>200</id>
<threadId>65</threadId>
<address>+123456789</address>
<person>1</person>
<date>1387977340608</date>
<body> This is a text </body>
<type>1</type>
<read>1</read>
</sms>
</smsall>
运行 XSLT 1.0 后我需要的格式:
<?xml version="1.0" encoding="UTF-8"?>
<allsms count="1">
<sms address="+123456789" time="" date="1387977340608" type="1" body="This is a text" read="1" service_center="" name="" />
</allsms>
我花了很多天,但我失败得很惨。请问谁能帮我?
这个问题不是很复杂,但你必须记住两个细节:
首先:XSLT 1.0中xsl:attribute
的语法不允许select
属性。相反,您必须使用此标签的内容,例如:
<xsl:attribute name="address">
<xsl:value-of select="address"/>
</xsl:attribute>
第二个:要有一个内容为空的属性,就足够了 放置仅使用名称的xsl:attribute
,但没有任何内容,例如:
<xsl:attribute name="time"/>
因此,脚本可能如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="smsall">
<allsms>
<xsl:attribute name="count">
<xsl:value-of select="count(sms)"/>
</xsl:attribute>
<xsl:apply-templates/>
</allsms>
</xsl:template>
<xsl:template match="sms">
<sms>
<xsl:attribute name="address">
<xsl:value-of select="address"/>
</xsl:attribute>
<xsl:attribute name="time"/>
<xsl:attribute name="date">
<xsl:value-of select="date"/>
</xsl:attribute>
<xsl:attribute name="type">
<xsl:value-of select="type"/>
</xsl:attribute>
<xsl:attribute name="body">
<xsl:value-of select="normalize-space(body)"/>
</xsl:attribute>
<xsl:attribute name="read">
<xsl:value-of select="read"/>
</xsl:attribute>
<xsl:attribute name="service_center"/>
<xsl:attribute name="name"/>
</sms>
</xsl:template>
</xsl:stylesheet>
有关工作示例(在 XSLT 1.0中),请参见 http://xsltransform.net/nb9MWsZ