выбор значения тега в xslt - PullRequest
0 голосов
/ 28 мая 2018

Я хочу преобразовать XML-файл в CSV и выбрать какое-либо значение из тега, который уже существует с тем же именем:

Пример содержимого файла XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <PayrunDetails>
        <PayrunNumber>000777</PayrunNumber>
    </PayrunDetails>
    <PayLocation>
        <LocationCode>ACT</LocationCode>
        <LocationDescription>ACT</LocationDescription>
        <CompanyDetails>
            <CName>APPLE Limited</CName>
            <Payslip>
                <StaffNumber>12345</StaffNumber>
                <PayDetails>
                    <AmountGross>9999</AmountGross>
                    <ComponentDetails>
                        <ComponentType ID="SALARY">
                            <Amount>1999</Amount>
                            <YTDAmount>10616</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                    <ComponentDetails>
                        <ComponentType ID="TAX">
                            <Amount>7305</Amount>
                            <YTDAmount>76703</YTDAmount>
                        </ComponentType>
                    </ComponentDetails>
                </PayDetails>
            </Payslip>
        </CompanyDetails>
    </PayLocation>
</root>

В приведенном выше XML-файле вы можете увидеть ComponentType с идентификатором 'SALARY', поэтому я проверяю его с помощью условия if, но во время выбора значения 'Amount' он выбирает значение из идентификатора ComponentType 'SALARY.', а также из' TAX '.

Мой 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="/">
<xsl:text> Amount &#xA;</xsl:text>
<xsl:for-each select="root">
    <xsl:for-each select="//Payslip">

    <xsl:if test="PayDetails/ComponentDetails/ComponentType/@ID='SALARY'">
        <xsl:apply-templates select="PayDetails/ComponentDetails/ComponentType/Amount"/>
    </xsl:if>

    <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
</xsl:for-each>
</xsl:template> 
<xsl:template match="*[contains(., ',')]">
<xsl:text>"</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>

В приведенном выше xsl-коде я использую условие' if 'для проверки ComponentType= 'SALARY', и если он совпадает с именем тега, он выберет значение из своего подтега 'salary, но мне не удалось выбрать только тег зарплаты для ComponentType =' SALARY.Он выбирает все существующие значения с именем «зарплата» в файле XML.Пожалуйста, помогите мне выйти из проблемы и скажите, как выбрать определенный тег в xsl.

1 Ответ

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

Ваше условие if по существу говорит: «Если есть ComponentTypes с идентификатором зарплаты, то выберите все ComponentTypes. xsl:apply-templates - это совершенно другое утверждение, чем xsl:if.

Что вам нужноЗамените xsl:if и xsl:apply-templates одним xsl:apply-templates следующим образом:

<xsl:apply-templates select="PayDetails/ComponentDetails/ComponentType[@ID='SALARY']/Amount"/>

Квадратные скобки в этом случае представляют собой условие, которое должно быть проверено для выбранного узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...