我还在学习我的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>
</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>
答案 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>
或者,如果永远不会有多个Selection1
或Selection2
,那么您根本不需要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>
</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>