2011-06-07 69 views
0

在这里不用我的XML标签如何检查呢元素存在于XML或不XSLT

<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> 
+0

标点符号是你的朋友。如果你想让人们理解并帮助你。 – LarsH 2011-06-07 15:07:58

回答

0

尝试按以下

<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
<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

迈克

+0

您好迈克根据你的意见我已经使用了如下的代码 ' ' 但它导致空descritpion每wageDesc 请告知 – 2011-06-07 08:23:45

+0

对不起 - 忘了循环 - 但仍然有资格 - //应该由替换? – Mike 2011-06-07 11:58:05

1
<xsl:choose> 
<xsl:when test="WageDesc[text() = 'WithHoldingTax(S)']"> 
withholdingtax(R) 
</xsl:when> 
<xsl:otherwise> 
withholdingtax 
</xsl:otherwise> 
</xsl:choose> 
+0

您好thnx为您的建议,但它会代替所有与税收(R)的税(S),我得到了我自己的答案,如下所示 0且WageDesc = 'WithHoldingTax' “> 的(R) 的 < xsl:value-of select =“WageDesc”/> 2011-06-07 09:01:43

1

在模板匹配WageDesc使用:

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

请注意:在许多情况下,如在此一家,别无XSLT条件指令(如<xsl:choose><xsl:if> o r <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> 
+0

+1为好的答案。读者注意:当上面两个模板中的第一个匹配一个元素时,即使第二个模板也匹配相同的元素,它将被使用。这是因为第一个模板具有较高的默认优先级(基本上是因为它“更具体”;请参阅http://www.w3.org/TR/xslt#dt-default-priority )。 – LarsH 2011-06-11 19:33:10