Как получить значение из родительского и определенного дочернего тега из XML-файла, используя XSLT - PullRequest
0 голосов
/ 22 мая 2018

Я бы попытался преобразовать 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, поэтомупрошу прощения за потенциальный вопрос новичка.Любое руководство будет оценено здесь.Заранее спасибо.

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.

1 Ответ

0 голосов
/ 22 мая 2018

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

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

PayDetails/AmountNet

вместо просто

AmountNet

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

Update

Оставьте <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;')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...