xsl转换缩进不是out-denting

时间:2014-03-19 23:29:58

标签: xml xslt

我转换了一个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;。可以这样做吗?

2 个答案:

答案 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的有效性无关。不同的处理器可能有不同的缩进规则。

-
附:你可以让你的样式表更简单,更短。