正在检索具有(或没有)子节点以应用条件模板的节点



我读了很多文章,但没有发现对我的问题有决定性的帮助。

我有一个XML文档,我对它应用xslt以获得csv文件作为输出。我向xsl转换发送一个参数,以筛选目标节点以应用模板。

xml文档看起来是这样的(为了理解,我删除了一些不有用的节点):

<GetMOTransactionsResponse xmlns="http://www.exane.com/pott" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.exane.com/pott PoTTMOTransaction.xsd">
<MOTransaction>
    <Transaction VersionNumber="2" TradeDate="2013-11-20">
        <TransactionId Type="Risque">32164597</TransactionId>
        <InternalTransaction Type="Switch">
            <BookCounterparty>
                <Id Type="Risque">94</Id>
            </BookCounterparty>
        </InternalTransaction>
        <SalesPerson>
            <Id Type="Risque">-1</Id>
        </SalesPerson>
    </Transaction>
    <GrossPrice>58.92</GrossPrice>
    <MOAccount Account="TO1E" />
    <Entity>0021</Entity>
</MOTransaction>
<MOTransaction>
    <Transaction VersionNumber="1" TradeDate="2013-11-20">
        <TransactionId Type="Risque">32164598</TransactionId>
        <SalesPerson>
            <Id Type="Risque">-1</Id>
        </SalesPerson>
    </Transaction>
    <GrossPrice>58.92</GrossPrice>
    <MOAccount Account="TO3E" />
    <Entity>0021</Entity>
</MOTransaction>
</GetMOTransactionsResponse>

我的xslt如下(很抱歉它很长,我写得比实际更简单):

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:pott="http://www.exane.com/pott">
  <xsl:output method="text" omit-xml-declaration="no" indent="no" />
  <xsl:param name="instrumentalSystem"></xsl:param>
  <xsl:template name="abs">
    <xsl:param name="n" />
    <xsl:choose>
      <xsl:when test="$n = 0">
        <xsl:text>0</xsl:text>
      </xsl:when>
      <xsl:when test="$n &gt; 0">
        <xsl:value-of select="format-number($n, '#')" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="format-number(0 - $n, '#')" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <xsl:template name="outputFormat">
    <!--Declaration of variables-->
    <xsl:variable name="GrossPrice" select="pott:GrossPrice" />
    <xsl:variable name="TransactionId" select="pott:Transaction/pott:TransactionId[@Type='Risque']" />
    <xsl:variable name="VersionNumber" select="pott:Transaction/@VersionNumber" />
    <!--Set tags values-->
    <xsl:value-of select="$Entity" />
    <xsl:text>;</xsl:text>
    <xsl:value-of select="concat('0000000', pott:MOAccount/@Account) "/>
    <xsl:text>;</xsl:text>
    <xsl:text>;</xsl:text>
    <xsl:value-of select="$TransactionId" />
    <xsl:text>;</xsl:text>
    <xsl:value-of select="$VersionNumber" />
    <xsl:text>&#13;&#10;</xsl:text>
  </xsl:template>
  <xsl:template match="/">
    <xsl:choose>
      <!-- BB -->
      <xsl:when test="$instrumentalSystem = 'BB'">
        <!--xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]"-->
        <xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]">
          <xsl:call-template name="outputFormat"></xsl:call-template>
        </xsl:for-each>
      </xsl:when>
      <!-- CP -->
      <xsl:when test="$instrumentalSystem = 'CP'">
        <xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[not(pott:InternalTransaction)]">
          <xsl:call-template name="outputFormat"></xsl:call-template>
        </xsl:for-each>
      </xsl:when>
      <xsl:otherwise>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

如果参数=BB,我希望选择MOTransaction节点,这些节点具有包含InternalTransaction节点的子Transaction。

如果参数=CP,我想选择没有包含InternalTransaction节点的子Transaction的MOTransaction节点

当我写作pott:GetMOTransactionsResponse/pot:MOTransaction/pot:Transaction[pot:InternalTransaction],我得到的是Transaction节点,而不是MOTransaction节点我想我离预期的结果不远了,但尽管我做了很多尝试,我还是失败了。如果有人能帮我的话。

我希望说清楚,否则我可以提供更多信息。

查看xsl:for-each语句中的一个,您正在执行

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction/pott:Transaction[pott:InternalTransaction]">

您说要选择MOTransaction元素,但实际上是在选择Transaction子元素。为了匹配您需要的逻辑,它应该是这个

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction[pott:InternalTransaction]]">

事实上,这也应该工作

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction/pott:InternalTransaction]">

类似地,对于第二个语句(在参数为"CP"的情况下),它可能看起来像这个

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction[not(pott:InternalTransaction)]]">

或者,它可能看起来像这个

<xsl:for-each select="pott:GetMOTransactionsResponse/pott:MOTransaction[not(pott:Transaction/pott:InternalTransaction)]">

不过,它们并不完全相同,因为第一个将只包括具有Transaction子元素的MOTransaction元素,而第二个将包括根本没有任何Transactionchild的MOTransaction

顺便说一句,您不需要在这里为每个和xsl:call-template使用xsl:。最好使用模板匹配。

首先,尝试将命名模板<xsl:template name="outputFormat">更改为此

<xsl:template match="pott:MOTransaction">

然后,您可以重写并将xsl:for-eachxsl:call-template合并为一个xs:apply-templates调用。

<xsl:apply-template select="pott:GetMOTransactionsResponse/pott:MOTransaction[pott:Transaction/pott:InternalTransaction]" />

相关内容

  • 没有找到相关文章

最新更新