2014-10-08 125 views
0

特定的值。這是我的XML:檢查是否至少有一個孩子有XSLT 1.0

<LIGHT_INFORMATION_LIST> 
    <LIGHT_INFORMATION> 
     <LIGHT_CHARACTERISTICS>Al</LIGHT_CHARACTERISTICS> 
     <LIGHT_COLOUR>W-G</LIGHT_COLOUR> 
    </LIGHT_INFORMATION> 
    <LIGHT_INFORMATION> 
     <LIGHT_CHARACTERISTICS>Al</LIGHT_CHARACTERISTICS> 
     <LIGHT_COLOUR>W-R</LIGHT_COLOUR> 
    </LIGHT_INFORMATION> 
    <LIGHT_INFORMATION> 
     <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS> 
     <LIGHT_COLOUR>R</LIGHT_COLOUR> 
    </LIGHT_INFORMATION> 
    <LIGHT_INFORMATION> 
     <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS> 
     <LIGHT_COLOUR>G</LIGHT_COLOUR> 
    </LIGHT_INFORMATION> 
    <LIGHT_INFORMATION> 
     <LIGHT_CHARACTERISTICS>F</LIGHT_CHARACTERISTICS> 
     <LIGHT_COLOUR>W</LIGHT_COLOUR> 
    </LIGHT_INFORMATION> 
</LIGHT_INFORMATION_LIST> 

我竟被插入控件:

如果LIGHT_COLOUR的至少一個元素插入此LIGHT_INFORMATION_LIST包含「 - 」

我試過白衣這一點,但完全是錯誤的:

<xsl:choose> 
    <xsl:when test="not(contains(.,'-'))"> 
     <!-- do A --> 
    </xsl:when>  
    <xsl:otherwise> 
     <!-- do B --> 
    </xsl:otherwise> 
</xsl:choose> 

這是ACTU加盟我的XSLT代碼:

<xsl:for-each select="LIGHT_INFORMATION"> 
    <xsl:for-each select="LIGHT_COLOUR"> 
     <xsl:choose> 
      <xsl:when test="not(contains(.,'-'))"> <!-- This is the test Required --> 
       <xsl:choose> 
        <xsl:when test="following-sibling::LIGHT_RANGE >= 15"> 
         <span style="font-family:Univers Condensed; font-weight:bold;"> 
          <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])"> 
           <xsl:value-of select="."/> 
          </xsl:if> 
          <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]"> 
           <xsl:value-of select="."/> 
          </xsl:if> 
         </span> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])"> 
          <xsl:value-of select="."/> 
         </xsl:if> 
         <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]"> 
          <xsl:value-of select="."/> 
         </xsl:if> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:when> 
      <xsl:otherwise> 
      ciao <!-- I would insert this control here if LIGHT_COLOUR contain '-' --> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
</xsl:for-each> 

現在輸出的是:

的Ciao Ciao的RGW

我想,如果只有一個在LIGHT_INFORMATION_LIST的這個節點元素包含到LIGHT_COLOUR ' - ' 寫 '僑'

+1

我建議你澄清你的[上一個問題](http://stackoverflow.com/questions/26238335/xml-element-distinct-using-xslt-1-0),而不是開始另一個。 – 2014-10-08 10:04:58

回答

0

氏是解決方案:

<xsl:for-each select="LIGHT_INFORMATION"> 
    <xsl:choose> 
     <xsl:when test="not(contains(parent::LIGHT_INFORMATION_LIST//LIGHT_COLOUR, '-'))"> <!-- This is the solution --> 
      <xsl:for-each select="LIGHT_COLOUR"> 
       <xsl:choose> 
        <xsl:when test="following-sibling::LIGHT_RANGE >= 15"> 
         <span style="font-family:Univers Condensed; font-weight:bold;"> 
          <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])"> 
           <xsl:value-of select="."/> 
          </xsl:if> 
          <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]"> 
           <xsl:value-of select="."/> 
          </xsl:if> 
         </span> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:if test="not(preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF])"> 
          <xsl:value-of select="."/> 
         </xsl:if> 
         <xsl:if test=". != preceding::LIGHT_COLOUR[1][preceding::IMMUTABLE_ID = $EF]"> 
          <xsl:value-of select="."/> 
         </xsl:if> 
        </xsl:otherwise> 
       </xsl:choose>  
      </xsl:for-each> 
     </xsl:when> 
     <xsl:otherwise> 
     Ciao 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

插入在頭部的控制和使用父。

-1

以下兄弟只有在同一級別時纔會找到LIGHT_COLOR(即當前節點是LIGHT_CHARACTERISTIC節點,即使那樣它也只能找到一個。

要查看它們全部,您需要指定一個包含它們全部或全部或相對於當前節點的路徑。在這種情況下:

/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR 

此路徑將選擇所有LIGHT_COLOR節點。現在,我們要篩選出每一個節點,如果它不包含「 - 」:

/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")] 

我們不是在任何單個節點的真正感興趣,我們只想知道有多少這樣:

count (/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")]) 

因此,您的支票將是:

<xsl:when test='count (/LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_COLOUR[contains(., "-")])'> 

*編輯:修答案修訂問題* 如果你想要一個控制,那麼你只想做一次這樣移動它的循環之外:

<!-- Do this where we can see all of the LIGHT_COLOR tags --> 
<xsl:if test="contains(LIGHT_INFORMATION/LIGHT_COLOR, '-')"> 
Ciao 
</xsl:if> 
<xsl:for-each select="LIGHT_INFORMATION"> 
    <!-- as per your existing code. Remove the "otherwise" clause that is creating multiple controls. --> 
+2

你實際上並不需要'count()' - 一個'test',其值是一個節點集合,如果該集合是空的,則爲真,如果不是,則爲真。 – 2014-10-08 10:10:06

+0

的確如此,但我認爲初學者更容易理解額外步驟。 – Mike 2014-10-08 10:12:27

+0

我試過了,但沒跑。 – 2014-10-08 10:23:42