2011-06-07 65 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