XSLT如何删除不需要的输出

时间:2011-05-10 16:18:08

标签: xslt

我有一个xsl样式表,只提供所需内容,除了标签外输出的值,。有没有办法删除它们?方案是所需的输出是出现多次的发票的总发票金额。每次执行xslt时,参数p1都包含InvoiceNumber为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 个答案:

答案 0 :(得分:1)

添加

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

应该有帮助。

答案 1 :(得分:1)

我没有得到与您发布的结果相同的结果(仅351510137.00351510363.00351511239.50,所有文本节点),我不知道tempvar(未使用)的目的。

由于看起来您需要的只是特定InvoiceAmount的{​​{1}}值的总和,所以请保持简单并忽略其他所有内容:

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进行处理,或者如果您愿意,可以对其进行硬编码(参见版本1)。

注意:您是否更喜欢数字格式,例如求和的invoiceNumber(固定小数),然后您也可以使用format-number(…) function

答案 2 :(得分:1)

此转化

<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元素的唯一ID。

  5. 有一个模板匹配任何InvoiceAmount元素。它检查匹配的元素是否是节点集$vInvoiceAmounts中包含的第一个元素。如果是,则生成InvoiceAmount元素,其中包含单个文本节点子元素,其值为InvoiceAmount中包含的所有$vInvoiceAmounts元素的总和。否则什么也没做。

  6. 最后,还有第二个模板匹配任何文本节点并且什么也不做(在输出中删除它),有效地覆盖了默认XSLT处理的不必要的副作用 - 输出不需要的文本。