Как я могу использовать значение select правильным способом, если Node = X и мне нужна информация из папки, где находится Node = X - PullRequest
0 голосов
/ 06 мая 2019

У меня проблема с выбором значения из узла. Я хочу выбрать информацию, хранящуюся в cac: item / cbc: name, из InvoiceLine с идентификатором 2. Кажется, я не могу правильно использовать значение select, потому что он всегда получает ответ от первого узла, одного с идентификатором 1 в InvoiceLince. Может кто-нибудь помочь мне с выбором значения, сохраненного в cac: item / cbc: name из InvoiceLine с идентификатором 2?

<InvoiceLine>
<ID>1</ID>
<LineExtensionAmount currencyID="EUR">0</LineExtensionAmount>
<TaxTotal>
<TaxAmount currencyID="EUR">0</TaxAmount>
<TaxSubtotal>
<TaxableAmount currencyID="EUR">0</TaxableAmount>
<TaxAmount currencyID="EUR">0</TaxAmount>
<TaxCategory>
<ID>S</ID>
<Percent>0</Percent>
<TaxScheme>
<ID>VAT</ID>
</TaxScheme>
</TaxCategory>
</TaxSubtotal>
</TaxTotal>
<Item>
<Name>
Relatienaam:    : BLABLA
Bezoekadres : BLABLA2
</Name>
</Item>
<Price>
<PriceAmount currencyID="EUR">0</PriceAmount>
</Price>
</InvoiceLine>
<InvoiceLine>
<ID>2</ID>
<LineExtensionAmount currencyID="EUR">0</LineExtensionAmount>
<TaxTotal>
<TaxAmount currencyID="EUR">0</TaxAmount>
<TaxSubtotal>
<TaxableAmount currencyID="EUR">0</TaxableAmount>
<TaxAmount currencyID="EUR">0</TaxAmount>
<TaxCategory>
<ID>S</ID>
<Percent>0</Percent>
<TaxScheme>
<ID>VAT</ID>
</TaxScheme>
</TaxCategory>
</TaxSubtotal>
</TaxTotal>
<Item>
<Name>685000/06.0009/7603/355132.01</Name>
</Item>
<Price>
<PriceAmount currencyID="EUR">0</PriceAmount>
</Price>
</InvoiceLine>

Я уже пробовал следующий код:

<xsl:template match="/">
   <xsl:for-each select="/x:Invoice/InvoiceLine/ID[ID='2']">
      <xsl:if test="."><xsl:value-of select="substring(translate(cbc:Name,' ',''),1,6)"/></xsl:if>
   </xsl:for-each>
</xsl:template>

Я ожидаю выхода 685000, а не Релати. Я делаю что-то не так?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Когда вы пишете /x:Invoice/InvoiceLine/ID[ID='2']

Он найдет другой элемент ID в поле <ID>, я не уверен, что он выдаст вам ошибку или какой-либо неправильный вывод (на основе вашего описания)

Я предполагаю, что ваш ввод пока без пространств имен, поскольку он не упоминается в вопросе.

Попробуйте это: (Измените его, чтобы сложить пространства имен или измените сам вопрос)

Предполагаемый ввод:

<?xml version="1.0" encoding="UTF-8"?>
<Invoice>
<InvoiceLine>
    <ID>1</ID>
    <LineExtensionAmount currencyID="EUR">0
    </LineExtensionAmount>
    <TaxTotal>
        <TaxAmount currencyID="EUR">0</TaxAmount>
        <TaxSubtotal>
            <TaxableAmount currencyID="EUR">0</TaxableAmount>
            <TaxAmount currencyID="EUR">0</TaxAmount>
            <TaxCategory>
                <ID>S</ID>
                <Percent>0</Percent>
                <TaxScheme>
                    <ID>VAT</ID>
                </TaxScheme>
            </TaxCategory>
        </TaxSubtotal>
    </TaxTotal>
    <Item>
        <Name>
            Relatienaam: : BLABLA
            Bezoekadres : BLABLA2
        </Name>
    </Item>
    <Price>
        <PriceAmount currencyID="EUR">0</PriceAmount>
    </Price>
</InvoiceLine>
<InvoiceLine>
    <ID>2</ID>
    <LineExtensionAmount currencyID="EUR">0
    </LineExtensionAmount>
    <TaxTotal>
        <TaxAmount currencyID="EUR">0</TaxAmount>
        <TaxSubtotal>
            <TaxableAmount currencyID="EUR">0</TaxableAmount>
            <TaxAmount currencyID="EUR">0</TaxAmount>
            <TaxCategory>
                <ID>S</ID>
                <Percent>0</Percent>
                <TaxScheme>
                    <ID>VAT</ID>
                </TaxScheme>
            </TaxCategory>
        </TaxSubtotal>
    </TaxTotal>
    <Item>
        <Name>685000/06.0009/7603/355132.01</Name>
    </Item>
    <Price>
        <PriceAmount currencyID="EUR">0</PriceAmount>
    </Price>
</InvoiceLine>
</Invoice>

Решение может быть:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/">
    <xsl:for-each select="/Invoice/InvoiceLine">
        <xsl:if test="ID ='2'">
            <xsl:value-of select="substring(translate(Item/Name,' ',''),1,6)" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Найти демо здесь: https://xsltfiddle.liberty -development.net/94rmq6x

1 голос
/ 06 мая 2019

Вы хотите (вероятно) выражение это ...

/x:Invoice/InvoiceLine[ID='2']

В настоящее время, делая /x:Invoice/InvoiceLine/ID[ID='2'], вы выбираете сам элемент ID, но только в том случае, если у этого ID есть дочерний элемент ID из 2 (чего нет).

Делая /x:Invoice/InvoiceLine[ID='2'], вы выбираете элемент InvoiceLine, поэтому относительное выражение cbc:Name должно также что-то возвращать.

Обратите внимание, это предполагает, что вы правильно обрабатываете пространства имен, так как вы фактически не показывали никаких объявлений пространства имен в своем XML.

(Обратите внимание: если вы хотите выбрать элемент ID, вы должны написать /x:Invoice/InvoiceLine/ID[.='2'], но чтобы получить name, вам нужно будет сделать ../cbc:name, где для получения используется .. родитель текущего узла)

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