Выбор первого xml-узла с помощью xslt

#xml #xslt

#xml #xslt

Вопрос:

У меня есть следующий xml,

 <?xml version="1.0" encoding="utf-8"?>
<NewDataSet xmlns="www.asdsad.com/sdsad">
  <Balances>
    <AccountNumber>KK-888</AccountNumber>
    <SubAccountNumber>KK-888-1</SubAccountNumber>
    <TAcctID>1</TAcctID>
    <TransactionAccount>ARC Deposit</TransactionAccount>
    <Description />
    <Balance>0.0000</Balance>
  </Balances>
  <Balances>
    <AccountNumber>KK-888</AccountNumber>
    <SubAccountNumber>KK-888-2</SubAccountNumber>
    <TAcctID>2</TAcctID>
    <TransactionAccount>Assessments and Dues</TransactionAccount>
    <Description>This is the primary account for all associations dues and assessments. </Description>
    <Balance>170</Balance>
  </Balances>
  <Balances>
    <AccountNumber>KK-888</AccountNumber>
    <SubAccountNumber>KK-888-4</SubAccountNumber>
    <TAcctID>4</TAcctID>
    <TransactionAccount>Fines/Compliance</TransactionAccount>
    <Description />
    <Balance>0.0000</Balance>
  </Balances>
</NewDataSet>
  

Мне нужен этот результирующий xml сверху через xslt,

 <balance amount="170" />
  

Я передам номер субсчета в xslt, и мне нужны конкретные остатки / сумма баланса. В приведенном выше примере я передал значение SubAccountNumber как «KC1-0221-2», поэтому второй узел баланса сопоставлен, и его значение баланса равно «170». Кто-нибудь может помочь мне написать xslt для этого. (Примечание: только один узел будет соответствовать переданному номеру подсчета).

ОБНОВЛЕНО У меня нет проблем, если я могу создать xml с корневым узлом,

 <account>
     <balance amount="170" />
</account>
  

Комментарии:

1. Как вы будете передавать входные данные? используя параметры?

Ответ №1:

Отправная точка…

 <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:asd="www.asdsad.com/sdsad"
    exclude-result-prefixes="asd">

    <xsl:output omit-xml-declaration="yes"/>
    <xsl:param name="SAN" select="'KC1-0221-2'"/>

    <xsl:template match="/asd:NewDataSet">
        <balance amount="{asd:Balances[asd:SubAccountNumber=$SAN]/asd:Balance}"/>
    </xsl:template>

</xsl:stylesheet>
  

Обратите внимание, что это приведет к

 <balance amount="" />
  

В случае, если $SAN отсутствует во входном документе. В противном случае, как бы вы хотели вернуться в случае, если совпадение вообще отсутствует?

Комментарии:

1. В вопросе также упоминалось о желании «первого узла», этот ответ не затрагивает эту часть требования.

2. @Michael-Kay: Как обычно бывает, я думаю, что вопрос в названии на самом деле не соответствует запросу OP. Однако это всего лишь вопрос выбора «первого узла», и мы можем легко настроить ответ.