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

如何使用XSLT从XML文件中获取父标记和特定子标记的值

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

    我将尝试将XML文件转换为csv,并从以下方面获得帮助 link 但是在一个地方,我必须从父标记和XML文件中的某个特定子标记中检索值。我的输入XML如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <Payslip>
        <StaffNumber>123456</StaffNumber>
        <StaffName>ALIBABA</StaffName>
        <Sex/>      
        <PayDetails>
            <PayType>NORMAL</PayType>
            <AmountNet>2100</AmountNet> 
            <ComponentDetails>
                <ComponentType>SALARY</ComponentType>
                <ComponentSource/>
                <Code>SAL</Code>
            </ComponentDetails>                     
            <ComponentDetails>
                <ComponentType>DED</ComponentType>
                <ComponentSource/>
                <Code>DEN</Code>
            </ComponentDetails>     
        </PayDetails>
        <LeaveTaken>
            <StartDate/>
            <EndDate/>
            <Balance>0</Balance>
        </LeaveTaken>
    </Payslip>
    

    我的XSL文件看起来是这样的,请注意,我已经为一些其他需求放置了一些硬编码值。

    我对XSLT还比较陌生,所以请原谅潜在的新手问题。任何指导都将不胜感激。事先谢谢。

    样式.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="/"> Worker,Pay_Group,Pay_Period_End_Date,Payment_Date,Net_Amount,Gross_Amount,Currency,Ck_Number,Display_Date
        <xsl:for-each select="//Payslip">
          <xsl:value-of select="concat(StaffNumber,',','PAY_GROUP',',','2017-09-24-00:00',',','2017-09-27-00:00',',',AmountNet,',','AmountGross',',','AUD',',','393',',','SLP000393_',StaffNumber,'.pdf',',','&#xA;')"/>
        </xsl:for-each>
      </xsl:template>
    
    </xsl:stylesheet>
    

    在上面的代码中,如果我使用

    <xsl:for-each select="//Payslip">
    

    然后我只得到staffNumber和staffName字段,但是如果我使用

    <xsl:for-each select="//Payslip//PayDetails">
    

    若要从amountnet标记中获取值,则无法从staffNumber标记中获取值。

    1 回复  |  直到 7 年前
        1
  •  1
  •   David -    6 年前

    你只得到 StaffNumber StaffName 因为他们是 Payslip 节点。为了获取其他节点的值,必须为每个节点指定正确的xpath表达式。

    例如,为了获得 AmountNet 您应该将其路径称为:

    PayDetails/AmountNet
    

    而不是仅仅

    AmountNet
    

    因为for each循环中的当前节点是 工资单 节点。

    更新

    离开 <xsl:for-each select="//Payslip"> 参考 工资单 节点。只需更改下面的行:

    <xsl:value-of select="concat(StaffNumber,',','PAY_GROUP',',','2017-09-24-00:00',',','2017-09-27-00:00',',',AmountNet,',','AmountGross',',','AUD',',','393',',','SLP000393_',StaffNumber,'.pdf',',','&#xA;')"/>
    

    致:

    <xsl:value-of select="concat(StaffNumber,',','PAY_GROUP',',','2017-09-24-00:00',',','2017-09-27-00:00',',',PayDetails/AmountNet,',','AmountGross',',','AUD',',','393',',','SLP000393_',StaffNumber,'.pdf',',','&#xA;')"/>