Получить значение из родительского и дочернего тегов из XML-файла с помощью XSLT

Я пытаюсь преобразовать файл XML в CSV, и мне помогают следующие ссылка, но попал в место, где мне нужно получить значение из родительского тега и определенного дочернего тега из 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.


person venus    schedule 22.05.2018    source источник


Ответы (1)


Вы получаете только значения StaffNumber и StaffName, поскольку они являются прямыми потомками узла Payslip. Чтобы получить значения других узлов, вы должны указать правильные выражения XPath для каждого из них.

Например, чтобы получить значение AmountNet, вы должны обратиться к его пути как:

PayDetails/AmountNet

вместо того, чтобы просто

AmountNet

поскольку текущим узлом внутри цикла for-each является узел Payslip.

Обновить

Оставьте <xsl:for-each select="//Payslip"> для ссылки на узел 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;')"/>
person David -    schedule 22.05.2018
comment
Еще одна проблема, с которой я столкнулся. Если два тега находятся на одном уровне, и я хочу получить значение из первого тега и из второго тега, который содержит несколько дочерних и поддочерних элементов, для которых я должен использовать итератор, то как мне выбрать значения и, наконец, как сделать результат печати из обоих тегов. - person venus; 24.05.2018