我转换了一个xml文件,但我希望生成的xml正确缩进。我正在使用xsltproc进行转换。
这是xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BatchMember>
<Member>
<CardNumber>6033231191667103</CardNumber>
<Title>Mr</Title>
<FirstName>Michael</FirstName>
<MiddleName/>
<Surname>Mouse</Surname>
<Dob>1959-11-09</Dob>
<Gender/>
<Add1>The Den</Add1>
<Add2/>
<City>Disneyland</City>
<County>Orange</County>
<Country>USA</Country>
<Email>mmouse@gmail.com</Email>
<Phone>01234567</Phone>
<EmailContact>1</EmailContact>
<PostContact>1</PostContact>
<SmsContact>1</SmsContact>
<PhoneContact>1</PhoneContact>
<Signed>1</Signed>
<StaffNo>12121</StaffNo>
<DepartNo>123574</DepartNo>
<Arnotts>1</Arnotts>
<Boyers>1</Boyers>
<Verify>1</Verify>
</Member>
<Member>
<CardNumber>6033231191667104</CardNumber>
<Title>Ms</Title>
<FirstName>Minnie</FirstName>
<MiddleName/>
<Surname>Mouse</Surname>
<Dob/>
<Gender/>
<Add1>The Den</Add1>
<Add2/>
<City>Disneyland</City>
<County>Orange</County>
<Country>USA</Country>
<Email>mmouse@yahoo.co.uk</Email>
<Phone>7111111</Phone>
<EmailContact>1</EmailContact>
<PostContact/>
<SmsContact/>
<PhoneContact>1</PhoneContact>
<Signed>1</Signed>
<StaffNo>32145</StaffNo>
<DepartNo>24544</DepartNo>
<Arnotts/>
<Boyers>1</Boyers>
<Verify>1</Verify>
</Member>
</BatchMember>
这是xslt代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template name="formatDate">
<xsl:param name="dateTime" />
<xsl:variable name="date" select="substring-before($dateTime, 'T')" />
<xsl:variable name="year" select="substring-before($date, '-')" />
<xsl:variable name="month" select="substring-before(substring-after($date, '-'), '-')" />
<xsl:variable name="day" select="substring-after(substring-after($date, '-'), '-')" />
<xsl:value-of select="concat($year, ' ', $month, ' ', $day)" />
</xsl:template>
<xsl:template name="formatTime">
<xsl:param name="dateTime" />
<xsl:value-of select="substring-after($dateTime, 'T')" />
</xsl:template>
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:variable name="today">
<xsl:value-of select="ex:date()"/>
</xsl:variable>
<xsl:variable name="date">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:template match="BatchMember">
<xsl:copy>
<xsl:value-of select="$newline"/>
<xsl:element name="Version" >1.0</xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="ClientId" >1</xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="PartnerId" >Dummy</xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="BatchId" ><xsl:value-of select='concat("27_SFN_",$today,"_00000000")'/> </xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="BatchDateTime" ><xsl:value-of select="ex:date-time()"/></xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="MemCount" ><xsl:value-of select="count(.//item)"/></xsl:element>
<xsl:value-of select="$newline"/>
<xsl:element name="ImportType" >Append</xsl:element>
<xsl:value-of select="$newline"/>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:param name="true-text" select="'True'"/>
<xsl:param name="false-text" select="'False'"/>
<xsl:template match="Member">
<xsl:copy>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="CardNumber"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Title"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="FirstName"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="MiddleName"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Surname"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Dob"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Gender"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Add1"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Add2"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="City"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="County"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Country"/>
<xsl:apply-templates select="Postcode"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Email"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Phone"/>
<xsl:apply-templates select="NoContact"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="EmailContact"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="PostContact"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="SmsContact"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="PhoneContact"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Signed"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="StaffNo"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="DepartNo"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Arnotts"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Boyers"/>
<xsl:value-of select="$newline"/>
<xsl:apply-templates select="Verify"/>
<xsl:value-of select="$newline"/>
</xsl:copy>
</xsl:template>
<!-- Batch Date and Time -->
<xsl:template match="BatchDateTime">
<xsl:variable name="date-string" select="BatchDateTime"/>
<BatchDateTime>
<xsl:if test=". != ' '">
<xsl:value-of select="ex:date-time()"/>
</xsl:if>
</BatchDateTime>
</xsl:template>
<xsl:template match="FirstName">
<FirstName>
<xsl:value-of select="normalize-space()" />
</FirstName>
</xsl:template>
<!-- Dates Concatenation -->
<xsl:template match="Dob">
<xsl:variable name="date-string" select="Dob"/>
<Dob>
<xsl:if test=". != ' '">
<xsl:value-of select=
"concat(substring(.,9), '/',
(substring(.,6,2)), '/',
substring(.,1,4))"
/>
</xsl:if>
</Dob>
</xsl:template>
<xsl:template match="Date">
<Date>
<xsl:if test=". != ' '">
<xsl:value-of select=
"concat(substring(.,9), '/',
(substring(.,6,2)), '/',
substring(.,1,4))"
/>
</xsl:if>
</Date>
</xsl:template>
</xsl:stylesheet>
这是xml的结果:
<?xml version="1.0"?>
<BatchMember>
<Version>1.0</Version>
<ClientId>1</ClientId>
<PartnerId>Dummy</PartnerId>
<BatchId>27_SFN_2014-03-19_00000000</BatchId>
<BatchDateTime>2014-03-19T22:43:21Z</BatchDateTime>
<MemCount>0</MemCount>
<ImportType>Append</ImportType>
<Member>
<CardNumber>6033231191667103</CardNumber>
<Title>Mr</Title>
<FirstName>Michael</FirstName>
<MiddleName/>
<Surname>Mouse</Surname>
<Dob>09/11/1959</Dob>
<Gender/>
<Add1>The Den</Add1>
<Add2/>
<City>Disneyland</City>
<County>California</County>
<Country>USA</Country>
<Email>mmouse@gmail.com</Email>
<Phone>01234567</Phone>
<EmailContact>1</EmailContact>
<PostContact>1</PostContact>
<SmsContact>1</SmsContact>
<PhoneContact>1</PhoneContact>
<Signed>1</Signed>
<StaffNo>12121</StaffNo>
<DepartNo>123574</DepartNo>
<Arnotts>1</Arnotts>
<Boyers>1</Boyers>
<Verify>1</Verify>
</Member>
<Member>
<CardNumber>6033231191667104</CardNumber>
<Title>Ms</Title>
<FirstName>Minnie</FirstName>
<MiddleName/>
<Surname>Mouse</Surname>
<Dob>//</Dob>
<Gender/>
<Add1>The Den</Add1>
<Add2/>
<City>Disneyland</City>
<County>Orange</County>
<Country>USA</Country>
<Email>mmouse@yahoo.co.uk</Email>
<Phone>7111111</Phone>
<EmailContact>1</EmailContact>
<PostContact/>
<SmsContact/>
<PhoneContact>1</PhoneContact>
<Signed>1</Signed>
<StaffNo>32145</StaffNo>
<DepartNo>24544</DepartNo>
<Arnotts/>
<Boyers>1</Boyers>
<Verify>1</Verify>
</Member>
</BatchMember>
正如您所看到的,</Member>
并未超越&#34;。可以这样做吗?
答案 0 :(得分:2)
您的输出包含三个来源的空格:从源文档复制的空格,样式表XSLT代码添加的空格以及序列化程序在缩进过程中添加的空格。结果,毫不奇怪,是一团糟。
使用<xsl:strip-space elements="*"/>
摆脱第一种。
通过避免使用<xsl:value-of select="$newline"/>
来摆脱第二种情况。
这应该只留下压头添加的空白。
答案 1 :(得分:1)
尝试删除以下所有实例:
<xsl:value-of select="$newline"/>
从样式表中。它们毫无意义,因为您的输出是XML,并且这些不是任何已处理文本节点的一部分。
明确应用模板,例如:
<xsl:apply-templates select="Member"/>
而不是:
<xsl:apply-templates/>
也可能会有所帮助。
请注意,问题纯粹是装饰性的 - 它与输出XML的有效性无关。不同的处理器可能有不同的缩进规则。
-
附:你可以让你的样式表更简单,更短。