【问题标题】:Get value from parent and child tag from a xml file using XSLT使用 XSLT 从 xml 文件中的父标签和子标签获取值
【发布时间】:2018-05-22 17:45:19
【问题描述】:

我正在尝试将 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 的新手,所以请原谅潜在的新手问题。任何指导将不胜感激。提前致谢。

style.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 标记中获取值。

【问题讨论】:

    标签: java xml xslt


    【解决方案1】:

    您只能获得StaffNumber 和StaffName 的值,因为它们是Payslip 节点的直接后代。为了获取其他节点的值,您必须为每个节点指定正确的 XPath 表达式。

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

    PayDetails/AmountNet
    

    而不仅仅是

    AmountNet
    

    因为 for-each 循环内的当前节点是 Payslip 节点。

    更新

    留下&lt;xsl:for-each select="//Payslip"&gt; 以引用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;')"/>
    

    【讨论】:

    • 我面临的另一个问题。如果两个标签处于同一级别,并且我想从第一个标签和包含多个子和子子的第二个标签中获取值,我必须使用迭代器,那么我如何选择值,最后如何打印两个标签的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多