在将XML转换为Text的同时,第二行在XSLT中移动了两个标签

时间:2020-07-04 17:03:41

标签: xml xslt

我有下面的xml,我写了一个XSLT来将输出转换成Text格式,但是在病房的第二行,输出被两个选项卡移动了,我不确定为什么。有人可以帮忙吗?

xslt有什么问题吗?是什么使第二行移位?

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <businessobjects>
        <entry>
            <HeaderLine>
                <HeaderRow>H</HeaderRow>
                <HeaderBusinessUnit/>
                <CurrentTime>0704202004:47:43</CurrentTime>
                <TotalAmountCredit>-6.084732570000003E6</TotalAmountCredit>
                <TotalAmountDebit>6.194972230000004E6</TotalAmountDebit>
                <LineEntries>948</LineEntries>
            </HeaderLine>
            <LineDetails>
                <Line>L</Line>
                <HeaderBusinessUnit/>
                <FinancialYear>2020</FinancialYear>
                <Period>5</Period>
                <EndDate>20200101</EndDate>
                <Period>5</Period>
                <GLBusinessUnit>UTEP1</GLBusinessUnit>
                <GLAccount/>
                <EntryType>DEBITJOURNALENTRY</EntryType>
                <Amount>10000</Amount>
                <Currency>USD</Currency>
                <CostCenter>14026800</CostCenter>
                <ContractCode>L0498</ContractCode>
                <ContractName>Base Case - AC</ContractName>
                <ContractLineCode>1886</ContractLineCode>
                <PostingCode>1</PostingCode>
            </LineDetails>
            
            
        </entry>
    </businessobjects>
</document>

使用XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:variable name='newline'>
        <xsl:text>
        </xsl:text>
    </xsl:variable>
    
    <xsl:template match="businessobjects">
       <xsl:for-each select="entry">
           <xsl:for-each select="HeaderLine">
            <xsl:value-of select="concat(HeaderRow,'|',HeaderBusinessUnit,'|',
                CurrentTime,'|',TotalAmountCredit,'|',
                TotalAmountDebit,'|',LineEntries,$newline)"/>
        </xsl:for-each>
           <xsl:for-each select="LineDetails">
               <xsl:value-of select="concat(Line,'|',HeaderBusinessUnit,'|',FinancialYear,
                   '|',Period,'|',EndDate,'|',GLBusinessUnit,'|',GLAccount,'|',EntryType,'|',Amount,'|',Currency,'|',CostCenter,'|',ContractCode,'|',ContractName,'|',ContractLineCode,'|',PostingCode,$newline)"/>
           </xsl:for-each>
       </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>

输出

H||0704202004:47:43|-6.084732570000003E6|6.194972230000004E6|948
        L||2020|5|20200101|UTEP1||DEBITJOURNALENTRY|10000|USD|14026800|L0498|Base Case - AC|1886|1
    


    

2 个答案:

答案 0 :(得分:2)

但是病房的第二行,输出移动了两个制表符,我 不知道为什么。

因为您的$newline变量包含换行符和两个标签:

<xsl:variable name='newline'>
    <xsl:text>
    </xsl:text>
</xsl:variable>

将其更改为:

    <xsl:variable name='newline'>
        <xsl:text>
</xsl:text>
    </xsl:variable>

或(最好是IMHO)摆脱该变量,而是使用所需的确切换行符,例如

<xsl:text>&#10;</xsl:text>

答案 1 :(得分:1)

您已将所有内容都放入了变量

<xsl:variable name='newline'>
    <xsl:text>
    </xsl:text>
</xsl:variable>

我宁愿使用<xsl:variable name="newline" select="'&#10;'"/>。如果您想像尝试用xsl:text来拼写一样,则只需插入换行符,例如

<xsl:variable name="newline">
  <xsl:text>
</xsl:text>
</xsl:variable>