如何从两个不同的标签获取值并使用XSLT连接它们

时间:2018-05-24 18:11:34

标签: javascript java xml xslt xml-parsing

我会尝试将XML文件转换为CSV,我正在从以下link获取帮助,但是我必须从同一级别存在的两个不同标记中检索值。 从第一个标记开始,我必须选择一个值,并从下一个标记中选择其子标记和子子标记值。 要从第二个标签中选择值,我使用的是迭代器,最后,我必须在同一行中发布输出,但我不知道如何从第一个标签和第二个标签中选择值并连接具有来自第二个标记的值的第一个标记的值。 为了进一步说明,我附上了以下示例输出:
我的输入XML示例如下:

<PayLocation>
    <LocationCode>VNS</LocationCode>
    <LocationDescription>VARANASI</LocationDescription>
    <PayrunDetails>
        <PayrunNumber>000428</PayrunNumber>
    </PayrunDetails>
    <CompanyDetails>
        <CompanyCode>Stack99</CompanyCode>
        <CompanyName>StackOverFlow</CompanyName>

        <Payslip>
            <StaffNumber>123456</StaffNumber>
            <StaffName>ALIBABA</StaffName>      
            <PayDetails>
                <AmountNet>2100</AmountNet> 
                <ComponentDetails>
                    <ComponentType>SALARY</ComponentType>
                    <Code>SAL</Code>
                </ComponentDetails>                          
            </PayDetails>
            <LeaveTaken>
                <Description>LEAVE</Description>
                <StartDate/>
                <EndDate/>
            </LeaveTaken>
        </Payslip>

        <Payslip>
            <StaffNumber>456789</StaffNumber>
            <StaffName>AMAZON</StaffName>      
            <PayDetails>
                <AmountNet>2200</AmountNet> 
                <ComponentDetails>
                    <ComponentType>SALARY</ComponentType>
                    <Code>SAL</Code>
                </ComponentDetails>                         
            </PayDetails>
            <LeaveTaken>
                <Description>LEAVE</Description>
                <StartDate>2015-05-28</StartDate>
                <EndDate>2015-05-31</EndDate>
            </LeaveTaken>
        </Payslip>
    </CompanyDetails>
</PayLocation>

我的预期输出样本如下:

output sample

上面的输出包含我从第一个标签获得的第一列值以及我从第二个标签及其子标签获得的其余值。

我也在分享我的XSL文件:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
StaffNumber,Payslip
<xsl:for-each select="//PayLocation/CompanyDetails/Payslip">
<xsl:value-of select="concat(StaffNumber,',',PayDetails/AmountNet,'&#xA;')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

请注意,我在上面的XSL文件中没有提到PayNumber,CompanyCode,CompanyName,因为我不知道如何选择第一个标签的值以及第二个标签。 我是XSLT的新手,所以请原谅潜在的新手问题。这里有任何指导意见。提前谢谢。

1 个答案:

答案 0 :(得分:0)

要获得CompanyCode(以及CompanyName),您可以执行此操作

parent::*/CompanyCode

即,将孩子CompanyCode置于当前父级

这可以简化为

../CompanyCode

同样地获得付款号码,这是祖母的孩子,这样做......

../../PayrunDetails/PayrunNumber

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
    <xsl:text>PayNumber,CompanyCode,CompanyNameStaffNumber,Payslip&#10;</xsl:text>
    <xsl:for-each select="//PayLocation/CompanyDetails/Payslip">
        <xsl:value-of select="concat(../../PayrunDetails/PayrunNumber,',',../CompanyCode,',',../CompanyName,',',StaffNumber,',',PayDetails/AmountNet,'&#xA;')"/>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>