XSLT对齐不同的子文本纯文本文件

时间:2016-10-25 00:15:22

标签: xml xslt

我还在学习我的XSLT,我有一个XML文档,它有两个不同的孩子,我需要排列我的员工数据,Selection1和Selection2。因此,员工数据按预期工作,同时具有Selection1和Selection2的员工的数据也是如此,但当员工有一个或另一个时,我无法获得正确的间距,即,如果没有Selection1数据,Selection2数据将从Selection1数据开始。

对此的任何帮助将不胜感激。

示例XML:

<Employee>
    <Employee_ID>QWERDFHUJKSDK123</Employee_ID>
    <Employee_Last_Name>Smith</Employee_Last_Name>
    <Employee_First_Name>Trent</Employee_First_Name>
    <Selection1>
        <Selection1Type>1234</Selection1Type>
        <Selection1Date>2017-01-01</Selection1Date>
        <Selection1Data>963258741</Selection1Data>
    </Selection1>
    <Selection2>
        <Selection2Type>9638</Selection2Type>
        <Selection2Date>2017-01-01</Selection2Date>
        <Selection2Data>963258741</Selection2Data>
    </Selection2>
   </employee>
<Employee>
    <Employee_ID>XCOIUEWRJFKLD</Employee_ID>
    <Employee_Last_Name>Bishop</Employee_Last_Name>
    <Employee_First_Name>Walter</Employee_First_Name>
    <Selection1>
        <Selection1Type>1234</Selection1Type>
        <Selection1Date>2017-01-01</Selection1Date>
        <Selection1Data>963258741</Selection1Data>
    </Selection1>
</employee>
<Employee>
    <Employee_ID>SDALFKJDSLLSDF</Employee_ID>
    <Employee_Last_Name>Farnsworth</Employee_Last_Name>
    <Employee_First_Name>Astrid</Employee_First_Name>
    <Selection2>
        <Selection2Type>9638</Selection2Type>
        <Selection2Date>2017-01-01</Selection2Date>
        <Selection2Data>963258741</Selection2Data>
    </Selection2>
</employee>

示例XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" 
    xmlns:this="urn:this-stylesheet"        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


  <!-- Variables -->
 <xsl:variable name="Pad50" select="'                                                  '"/>
  <xsl:variable name="NewLine">
    <xsl:text>&#x0D;&#x0A;</xsl:text>
  </xsl:variable>


  <xsl:output indent="no" method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">


    <!-- ************************************************* -->
    <!-- Employee                                          -->
    <!-- ************************************************* -->

    <xsl:for-each select="Employee">


      <xsl:value-of select="substring(concat(Employee_ID, $Pad50), 1, 20)"/>


      <xsl:value-of select="substring(concat(Employee_Last_Name, $Pad50), 1, 20)"/>


      <xsl:value-of select="substring(concat(Employee_First_Name, $Pad50), 1, 27)"/>



      <!-- ************************************************* -->
      <!-- Filler Rows                                       -->
      <!-- ************************************************* -->


      <xsl:value-of select="substring($Pad50, 1, 7)"/> 


      <xsl:value-of select="substring($Pad50, 1, 19)"/> 


      <xsl:value-of select="substring($Pad50, 1, 106)"/>



      <!-- ************************************************* -->
      <!-- Selection1                                        -->
      <!-- ************************************************* -->

    <xsl:for-each select="Selection1">


      <xsl:choose>
        <xsl:when test="Selection1Type ='1234'">
          <xsl:value-of select="substring(concat(Selection1Type, $Pad50), 1, 4)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="substring($Pad50, 1, 4)"/>
        </xsl:otherwise>
      </xsl:choose>


      <xsl:choose>
        <xsl:when test="Selection1Type = '1234'">
          <xsl:value-of select="substring(concat(format-date(Selection1Date, '[M01][D01][Y0001]'), $Pad50), 1, 8)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="substring($Pad50, 1, 8)"/>
        </xsl:otherwise>
      </xsl:choose>


      <xsl:choose>
        <xsl:when test="Selection1Type = '1234'">
          <xsl:value-of select="substring(concat(Selection1Data, $Pad50), 1, 10)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="substring($Pad50, 1, 10)"/>
        </xsl:otherwise>
      </xsl:choose>


      <xsl:value-of select="substring($Pad50, 1, 19)"/>

    </xsl:for-each>

      <!-- ************************************************* -->
      <!-- Selection2                                        -->
      <!-- ************************************************* -->

      <xsl:for-each select="Selection2">


        <xsl:choose>
          <xsl:when test="Selection2Type ='9638'">
            <xsl:value-of select="substring(concat(Selection2Type, $Pad50), 1, 4)"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring($Pad50, 1, 4)"/>
          </xsl:otherwise>
        </xsl:choose>


        <xsl:choose>
          <xsl:when test="Selection2Type = '9638'">
            <xsl:value-of select="substring(concat(format-date(Selection2Date, '[M01][D01][Y0001]'), $Pad50), 1, 8)"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring($Pad50, 1, 8)"/>
          </xsl:otherwise>
        </xsl:choose>


        <xsl:choose>
          <xsl:when test="Selection2Type = '9638'">
            <xsl:value-of select="substring(concat(Selection2Data, $Pad50), 1, 10)"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring($Pad50, 1, 10)"/>
          </xsl:otherwise>
        </xsl:choose>


        <xsl:value-of select="substring($Pad50, 1, 19)"/>

      </xsl:for-each>


      <xsl:value-of select="$NewLine"/>    
    </xsl:for-each>




  </xsl:template>



</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

首先要注意的是,您的XML格式不正确。您有一个开始<Employee>代码,但是有一个结束</employee>代码。此外,您没有单个根元素。

假设这些只是您的问题的问题,您遇到问题的原因是您使用xsl:for-each。如果没有Selection元素,则不会输出任何内容,因此您的Selection2开头位置错误。

最简单的解决方法是在Selection1之后为任何xsl:for-each元素添加一个检查,以添加一些正确长度的填充

<xsl:if test="not(Selection1)">
    <xsl:value-of select="substring($Pad50, 1, 41)"/>
</xsl:if>

或者,如果永远不会有多个Selection1Selection2,那么您根本不需要xsl:for-each

试试这个XSLT

<xsl:stylesheet version="2.0" 
    xmlns:this="urn:this-stylesheet" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:variable name="Pad50" select="'                                                  '"/>
  <xsl:variable name="NewLine">
    <xsl:text>&#x0D;&#x0A;</xsl:text>
  </xsl:variable>

  <xsl:output indent="no" method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <xsl:for-each select="Employee">
      <xsl:value-of select="substring(concat(Employee_ID, $Pad50), 1, 20)"/>
      <xsl:value-of select="substring(concat(Employee_Last_Name, $Pad50), 1, 20)"/>
      <xsl:value-of select="substring(concat(Employee_First_Name, $Pad50), 1, 27)"/>

      <xsl:value-of select="substring(concat(Selection1/Selection1Type, $Pad50), 1, 4)"/>
      <xsl:choose>
        <xsl:when test="Selection1/Selection1Type = '1234'">
          <xsl:value-of select="substring(concat(format-date(Selection1/Selection1Date, '[M01][D01][Y0001]'), $Pad50), 1, 8)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="substring($Pad50, 1, 8)"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:value-of select="substring(concat(Selection1/Selection1Data, $Pad50), 1, 10)"/>

       <xsl:value-of select="substring($Pad50, 1, 1)"/>

        <xsl:value-of select="substring(concat(Selection2/Selection2Type, $Pad50), 1, 4)"/>
        <xsl:choose>
          <xsl:when test="Selection2/Selection2Type = '9638'">
            <xsl:value-of select="substring(concat(format-date(Selection2/Selection2Date, '[M01][D01][Y0001]'), $Pad50), 1, 8)"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring($Pad50, 1, 8)"/>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="substring(concat(Selection2/Selection2Data, $Pad50), 1, 10)"/>
      <xsl:value-of select="$NewLine"/>    
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>