代码之家  ›  专栏  ›  技术社区  ›  venus

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

  •  0
  • venus  · 技术社区  · 7 年前

    我将尝试将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 回复  |  直到 7 年前
        1
  •  0
  •   Tim C    7 年前

    为了得到 CompanyCode (和) CompanyName )你可以这么做

    parent::*/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>