как проверить, присутствует ли элемент в xml или нет в xslt - PullRequest
0 голосов
/ 07 июня 2011

здесь идет мой тег XML

<NewDataSet>
     <EETaxAmount>
          <WageID>TX01</WageID>
          <WageDesc>WithHoldingTax</WageDesc>
          <TaxAuthorityName>FED</TaxAuthorityName>
          <TaxAuthorityType>10</TaxAuthorityType>
          <Amount>931.25</Amount>
          <YTDAmount>982.92</YTDAmount>
     </EETaxAmount>
     <EETaxAmount>
          <WageID>TXS1</WageID>
          <WageDesc>WithHoldingTax(S)</WageDesc>
          <TaxAuthorityName>FED</TaxAuthorityName>
          <TaxAuthorityType>10</TaxAuthorityType>
          <Amount>50.00</Amount>
          <YTDAmount>50.00</YTDAmount>
     </EETaxAmount>
</NewDataSet>`

Теперь мой вопрос: мне нужно отобразить значение witholdingtax как withholdingtax (R), если у меня есть withholdingtax (s) в наборе данных, иначе как withholdingtax, мой xsl такой, как показано ниже

<xsl:for-each select="//NewDataSet/EETaxAmount">
  <xsl:sort select="TaxAuthorityType"/>
  <tr>
    <td class="txt5">
      <xsl:value-of select="WageDesc"/>
    </td>
    <td class="txt5">
      <xsl:value-of select="TaxAuthorityName"/>
    </td>
    <td class="txt_currency">
      <xsl:choose>
        <xsl:when test="Amount >=0 and Amount &lt;=1">
          <xsl:value-of select="format-number(Amount,'0.00')"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="format-number(Amount, '###,###.00')"/>
        </xsl:otherwise>
      </xsl:choose>
    </td>
    <td class="txt_currency">
      <xsl:choose>
        <xsl:when test="YTDAmount >=0 and YTDAmount &lt;1">
          <xsl:value-of select="format-number(YTDAmount,'0.00')"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="format-number(YTDAmount, '###,###.00')"/>
        </xsl:otherwise>
      </xsl:choose>
    </td>
  </tr>
</xsl:for-each>

Ответы [ 4 ]

1 голос
/ 07 июня 2011

В соответствии с шаблоном WageDesc используйте:

  <xsl:value-of select=
  "concat(., substring('(R)',
                       4 - 3*(/*/*/WageDesc = 'WithHoldingTax(S)')
                       )
          )"/>

Примечание : во многих случаях, как в этом, отсутствуют условные инструкции XSLT (например, <xsl:choose> или <xsl:if> или <xsl:when>).

Другой простой способ избежать запутанной логики - это использовать два отдельных шаблона, соответствующих WageDesc каждый для одного из двух условий:

 <xsl:template match="WageDesc[/*/*/WageDesc = 'WithHoldingTax(S)']">
  <xsl:value-of select="concat(., '(R)')"/>
 </xsl:template>

 <xsl:template match="WageDesc">
  <xsl:value-of select="."/>
 </xsl:template>
1 голос
/ 07 июня 2011
<xsl:choose>
<xsl:when test="WageDesc[text() = 'WithHoldingTax(S)']">
withholdingtax(R)
</xsl:when>
<xsl:otherwise>
withholdingtax 
</xsl:otherwise>
</xsl:choose>
0 голосов
/ 07 июня 2011

Попробуйте согласно ниже

<xsl:choose>
<xsl:when test="count(//NewDataSet/EETaxAmount[WageDesc ='WithHoldingTax(S)'])>0 and WageDesc='WithHoldingTax'">
<xsl:value-of select="WageDesc"/>(R)
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="WageDesc"/>
</xsl:otherwise>
</xsl:choose>
0 голосов
/ 07 июня 2011
<xsl:for-each select="NewDataSet/*">
  <xsl:if test="WageDesc[text() = 'WithHoldingTax(S)']"><xsl:value-of select="//WageDesc[text() = 'WithHoldingTax(R)']/text()" />  
  </xsl:if>  
</xsl:for-each>  

У меня есть сомнения относительно того, где находится узел контента, поэтому я выбрал // - возможно, вам следует использовать более квалифицированный XPath

Mike

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