XSLT как убрать нежелательный вывод - PullRequest
2 голосов
/ 10 мая 2011

У меня есть таблица стилей xsl, дающая практически все, что нужно, за исключением того, что значения выводятся за пределы тегов. Есть ли способ их удалить? Сценарий заключается в том, что желаемым результатом является общая сумма счета-фактуры для счетов-фактур, которые появляются более одного раза. Каждый раз, когда выполняется xslt, параметр p1 содержит InvoiceNumber to total. Приведенный ниже код показывает, что параметр p1 жестко задан как «351510».

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceNumber">
        <xsl:copy>
            <xsl:apply-templates select="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceAmount"/>
        </xsl:copy>
    </xsl:template>
    <xsl:param name="tempvar"/>
            <xsl:template name="InvTotal" match="/Invoices/Invoice[InvoiceNumber=351510][1]/InvoiceNumber">
        <xsl:variable name="p1" select="351510" />          
        <xsl:if test="/Invoices/Invoice/InvoiceNumber[. = $p1]">
        <!--<xsl:if test="$test = $p1" >-->
            <InvoiceAmount>
                <xsl:value-of select="sum(../../Invoice[InvoiceNumber=351510]/InvoiceAmount)"/>
            </InvoiceAmount>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Вот входные данные:

<Invoices>
- <Invoice>
  <InvoiceNumber>351510</InvoiceNumber> 
  <InvoiceAmount>137.00</InvoiceAmount> 
  </Invoice>
- <Invoice>
  <InvoiceNumber>351510</InvoiceNumber> 
  <InvoiceAmount>363.00</InvoiceAmount> 
  </Invoice>
- <Invoice>
  <InvoiceNumber>351511</InvoiceNumber> 
  <InvoiceAmount>239.50</InvoiceAmount> 
  </Invoice>
  </Invoices>

Вот вывод:

<InvoiceAmount>500</InvoiceAmount>137.00351510363.00351511239.50

Вот желаемый вывод:

<InvoiceAmount>500</InvoiceAmount>

Кроме того, спасибо вам, lwburk, который дал мне это далеко.

Problem is that the select statement xpath is not picking out the 'CarrierInvoiceAmount'.  This might work though if I can get the path correct.

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Я не получаю те же результаты, что и вы (только 351510137.00351510363.00351511239.50, все текстовые узлы), и я не знаю цели tempvar (не используется).

Поскольку кажется, что все, что вам нужно, это сумма InvoiceAmount значений для определенного InvoiceNumber, просто сохраните это простым и игнорируйте все остальное:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:param name="invoiceNumber"/>
    <xsl:template match="/">
        <InvoiceAmount>
            <xsl:value-of select="sum(/Invoices/Invoice[InvoiceNumber=$invoiceNumber]/InvoiceAmount)"/>
        </InvoiceAmount>
    </xsl:template>
</xsl:stylesheet> 

Вы можете передать InvoiceNumber для обработки через параметр invoiceNumber, или вы можете жестко его закодировать, если хотите (см. Версию 1).

Примечание: если вы предпочитаете числовой формат, например, например, #.00 (фиксированные десятичные дроби) для суммы, тогда вы также можете использовать функцию format-number(…) .

1 голос
/ 11 мая 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNum" select="351510"/>

 <xsl:key name="kInvAmmtByNumber" match="InvoiceAmount"
          use="../InvoiceNumber"/>

 <xsl:variable name="vInvoiceAmounts" select=
  "key('kInvAmmtByNumber', $pNum)"/>

 <xsl:variable name="vIdInvAmount1" select=
  "generate-id($vInvoiceAmounts[1])"/>

 <xsl:template match="InvoiceAmount">
  <xsl:if test="generate-id() = $vIdInvAmount1">
   <InvoiceAmount>
    <xsl:value-of select="sum($vInvoiceAmounts)"/>
   </InvoiceAmount>
  </xsl:if>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному XML-файлу :

<Invoices>
    <Invoice>
        <InvoiceNumber>351510</InvoiceNumber>
        <InvoiceAmount>137.50</InvoiceAmount>
    </Invoice>
    <Invoice>
        <InvoiceNumber>351510</InvoiceNumber>
        <InvoiceAmount>362.50</InvoiceAmount>
    </Invoice>
    <Invoice>
        <InvoiceNumber>351511</InvoiceNumber>
        <InvoiceAmount>239.50</InvoiceAmount>
    </Invoice>
</Invoices>

производит именнотребуемый, правильный результат :

<InvoiceAmount>500</InvoiceAmount>

Пояснение :

  1. Требуемый номер счета-фактуры передается преобразованию в качестве значениявнешний / глобальный параметр $pNum.

  2. Мы используем ключ, который индексирует все элементы InvoiceAmount по их соответствующим значениям InvoiceNumber.

  3. Используя этот ключ, мы определяем переменную $vInvoiceAmounts, которая содержит набор узлов всех элементов InvoiceAmount, значение соответствующего элемента InvoiceNumber которых совпадает со значением внешнего параметра $pNum.

  4. Мы также определяем переменную ($vIdInvAmount1), которая содержит уникальный идентификатор первого такого элемента InvoiceAmount.

  5. Существует шаблон, которыйсоответствует любому элементу InvoiceAmount.Он проверяет, является ли соответствующий элемент первым из элементов, содержащихся в наборе узлов $vInvoiceAmounts.Если это так, элемент InvoiceAmount создается с одним дочерним узлом текстового узла, значение которого является суммой всех элементов InvoiceAmount, содержащихся в $vInvoiceAmounts.В противном случае ничего не делается.

  6. Наконец, существует второй шаблон, который соответствует любому текстовому узлу и ничего не делает (удаляет его в выходных данных), эффективно перекрывая нежелательный побочный эффект XSLT по умолчанию.обработка - вывод нежелательного текста.

1 голос
/ 10 мая 2011

Добавление

<xsl:template match="text()"/>

должно помочь.

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